###理解PHP延迟静态绑定 static::中的static其实是运行时所在类的别名,并不是定义类时所在的那个类名。这个东西可以实现在父类中能够调用子类的方法和属性。 使用(static)关键字来表示这个别名,和静态方法,静态类没有半毛钱的关系,static::不仅支持静态类,还支持对象(动态类)。
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
static::who(); // 后期静态绑定从这里开始
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test();
class Model
{
public static function find()
{
echo static::$name;
}
}
class Product extends Model
{
protected static $name = 'Product';
}
Product::find();
{
"name": "baocai/yprint",
"description": "Elind Printer SDK",
"type": "sdk",
"license": "MIT",
"authors": [
{
"name": "kelaocai",
"email": "[email protected]"
}
],
"minimum-stability": "dev",
"require": {},
"autoload": {
"psr-4": {
"BaoCai\\Yprint\\": "src/"
}
}
}
设置GitHub代码自动同步
主要填写两项Packagist配置信息:
用户名: 注意是Packagist上的用户名
Token: 通讯令牌
Domain: 可不用填写
composer require baocai/yprint dev-master
laravel Facade是通过class_alias来是实现的,通过Illuminate/Foundation/AliasLoader.php进行加载
###Laravel 5.3 代码生成器 - summerblue/generator ###这个包可以让你在浏览器上查看路由 composer require garygreen/pretty-routes ###读《代码整洁之道》有感
函数的第一规则是要短小。第二条规则则是还要更短小。
函数应该做一件事。做好这件事。只做这一件事。
每个函数一个抽象层级。自顶向下读代码。
public function login(Request $request)
{
$this->validateLogin($request);
if ($this->hasTooManyLoginAttempts($request)) {
$this->fireLockoutEvent($request);
return $this->sendLockoutResponse($request);
}
if ($this->attemptLogin($request)) {
return $this->sendLoginResponse($request);
}
$this->incrementLoginAttempts($request);
return $this->sendFailedLoginResponse($request);
}
public function calculatePay(Employee $e)
{
switch ($e->type) {
case COMMISSIONED :
return calculateCommissionedPay($e);
case HOURLY :
return calculateHourlyPay($e);
case SALARIED :
return calculateSalariedPay($e);
default:
throw new InvalidEmployeeType($e->type);
}
}
明显这个函数做了不止一件事
当出现新员工类型时需要增加。
违反了单一职责原则(SRP)
违反了开放闭合原则(OCP)
// 雇员抽象类
abstract class Employee {
public function isPayday($date);
public function calculatePay();
public function deliverPay($money);
}
// 雇员工厂
interface EmployeeFactory {
public function makeEmployee(EmployeeRecord $record);
}
// 工厂的具体实现
class EmployeeFactoryImpl implements EmployeeFactory {
public function makeEmployee(EmployeeRecord $record)
{
switch ($record->type) {
case COMMISSIONED :
return new CommissionedEmployee($record);
case HOURLY :
return new HourlyEmployee($record);
case SALARIED :
return new SalariedEmployee($record);
default:
throw new InvalidEmployeeType($record->type);
}
}
}
$employeeClass = $type.'Employee';
$employee = new $employeeClass();
echo get_class($field);
yarn global add vbuild
import Vue from 'vue'
new Vue({
el: '#app',
render: h => <h1>Hello World</h1>
})
vbuild index.js --dev
###从解决 bug 谈到学习 ###Laravel tap 用法
function tap($value, $callback)
{
$callback($value);
return $value;
}
$response = $next($request);
$this->storePasswordHashInSession($request);
return $response;
return tap($next($request), function () use ($request) {
$this->storePasswordHashInSession($request);
});
public function pull($key, $default = null)
{
return tap($this->get($key, $default), function ($value) use ($key) {
$this->forget($key);
});
}
###Speedy - 简洁灵活的 Laravel 管理后台
项目地址: https://github.com/HanSon/speedy
###搜索功能使用了此扩展包: ###Composer 包来,支持 Laravel 的事件广播 ###Request::intersect (...) 一个可以让你初步远离意大利面条的函数
$record = Record::findOrFail($id);
if ($request->has('title')) {
$record->title = $request->title;
}
if ($request->has('label')) {
$record->label = $request->label;
}
if ($request->has('year')) {
$record->year = $request->year;
}
if ($request->has('type')) {
$record->type = $request->type;
}
$record->save();
$record = Record::findOrFail($id);
$record->update($request->intersect([
'title',
'label',
'year',
'type'
]));
public function intersect($keys)
{
return array_filter($this->only(is_array($keys) ? $keys : func_get_args()));
}
###Laravel 认证原理及完全自定义认证 表单请求的时候所有的内容格式为 string , 所以不会有 true / false 存在了。 当然了,在写 API 时候 content-type: application/json 这类请求的时候还是不能直接这样用这个 feature 的。值为 0,0.0 的也会被过滤
如果使用 $request->only() 方法,即使数据不在 request data 中,only 方法也会将数据设置为 null,而其他两个示例则会过滤掉不在 request data 中的数据
Request::macro('pick', function ($keys) {
return array_intersect_key($this->all(), array_flip($keys));
});
$request = Request::create('/', 'GET', [
'a' => 'foo',
'b' => null,
'c' => false,
]);
dd([
'only' => $request->only(['a', 'b', 'c', 'd']),
'intersect' => $request->intersect(['a', 'b', 'c', 'd']),
'pick' => $request->pick(['a', 'b', 'c', 'd'])
]);
array:3 [
"only" => array:4 [
"a" => "foo"
"b" => null
"c" => false
"d" => null <-- 即使不在 request data 中,only 方法会默认设置为 null
]
"intersect" => array:1 [
"a" => "foo"
]
"pick" => array:3 [
"a" => "foo"
"b" => null
"c" => false
]
]
###Redis 五种常见使用场景下 PHP 实战 克隆项目: git clone [email protected]:TIGERB/easy-tips.git 运行脚本: php redis/test.php [实例名称], 例如测试悲观锁: 运行 php redis/test.php p-lock ###aliyun 发送短信的扩展包 composer require cmzz/laravel-aliyun-sms $smsService = App::make(AliyunSms::class); $smsService->send(strval($mobile), 'SMS_xxx', ['code' => strval(1234), 'product' => 'xxx']); ###用 Jenkins 部署 PHP 应用 ###对 REST 的理解 所有的东西都是资源,我们始终是在操作资源,当然资源需要是个名词。
于是我们定义出这样一些资源,users, products, orders, vendors。注意这里是复数,因为既然是资源,肯定是一堆,是个集合。单复数的概念还是很重要的。
###GitHub 导航栏 git clone [email protected]:RryLee/github-light-header.git
打开 chrome://extensions ###为 Laravel 博客添加 SiteMap 和 RSS 订阅 ###vue 的表单验证插件 https://github.com/logaretm/vee-validate ###Laravel5.3 版本的后台管理系统 https://github.com/DukeAnn/Laradmin ###Laravel 5.4 MySQL 数据库字符编码变更引起的字符串长度问题 原因是5.4版本的 Laravel 将 mysql 默认字符编码换成了utf8mb4 ,见config/database.php
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
utf8 的 varchar 类型字符串最长255,换成utf8mb4最长是191,然而框架里面默认长度还是用的 255 导致长度不够了,暂时解决方法是在 app/Providers/AppServiceProvider.php 添加字符默认长度:
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
$table->string('phone')->charset('utf8')->collate('utf8_general_ci')
###iTerm 2 上简单安装 Fish 并配置主题 ###Git 的使用基础和示例 ### Laravel 内 PHP artisan 命令提示 “Mcrypt PHP extension required” 的解决办法
PATH="/Library/Frameworks/Python.framework/Versions/3.5/bin:${PATH}" PATH="/Applications/MAMP/bin/php/php5.5.26/bin:${PATH}" export PATH ###为 Laravel 开发而配置的 Sublime Text 3 ###跟我一起学 Laravel-EloquentORM 基础部分 ###高效的从 HTML 中提取正文的类库 composer require "mylukin/textractor:dev-master"
<?php
$url = 'http://news.163.com/17/0204/08/CCDTBQ9E000189FH.html';
// 创建提取实例
$textractor = new \Lukin\Textractor();
// 下载并解析文章
$article = $textractor->download($url)->parse();
printf('<div id="url">URL: %s</div>' . PHP_EOL, $url);
printf('<div id="title">Title: %s</div>' . PHP_EOL, $article->getTitle());
printf('<div id="published">Publish: %s</div>' . PHP_EOL, $article->getPublishDate());
printf('<div id="text">Text: <pre>%s</pre></div>' . PHP_EOL, $article->getText());
printf('<div id="html">Content: %s</div>' . PHP_EOL, $article->getHTML());
###自己关于一个项目的编程思路 ###Laravel 用户认证体系详解 ###Laravel 技巧之 Pivot $user = App\User::find(1); foreach ($user->roles as $role) { echo $role->pivot->created_at; } ###PHP Swoole 蝌蚪聊天室 https://github.com/zhaohehe/swoole-tadpole ###搭建博客必备:图片拖动文本框自动上传 ###用好 Webpack2 从一个完整的配置开始 ###添加多个 Homestead box git clone https://github.com/laravel/homestead.git NewHomestead ###Laravel5.4 中使用 browsync 监控 CSS 并自动刷新页面 ###HTTPS 背后的内幕 HTTPS = HTTP + TLS/SSL ###Monolog 优化及打造 ELK 友好的日志格式 ###使用 Laravel Queue 不得不明白的知识 使用队列是为了:
异步 重试 耗时比较久的,比如上传一个文件后进行一些格式的转化等。 需要保证送达率的,比如发送短信,因为要调用别人的 api,总会有几率失败,那么为了保证送达,重试就必不可少了。 在开发环境我们想测试的时候,可以把 Queue driver 设置成为 sync,这样队列就变成了同步执行,方便调试队列里面的任务。 Job 里面的 handle 方法是可以注入别的 class 的,就像在 Controller action 里面也可以注入一样 本地调试的时候要使用 queue:listen,因为 queue:work在启动后,代码修改,queue:work不会再 Load 上下文,但是 queue:listen仍然会重新 Load 新代码 Redis 里面一个任务默认最多执行60秒,如果一个任务60秒没有执行完毕,会继续放回到队列中,循环执行 ###设计模式实践--单例模式
class test
{
private static $_instance; //保存类实例的私有静态成员变量
//定义一个私有的构造函数,确保单例类不能通过new关键字实例化,只能被其自身实例化
private final function __construct()
{
echo 'test __construct';
}
//定义私有的__clone()方法,确保单例类不能被复制或克隆
private function __clone() {}
//对外提供获取唯一实例的方法
public static function getInstance()
{
//检测类是否被实例化
if ( ! (self::$_instance instanceof self) ) {
self::$_instance = new test();
}
return self::$_instance;
}
}
test::getInstance();
在容器中,普通对象的绑定通过bind()方法,示例如下:
$app = new System\Foundation\Container();
$app->bind('test', \System\test::class);
而要绑定一个单例对象的时候则用下面的方式:
$app->singleton('test', \System\test::class);
class Human{
static public $name = "妹子";
public $height = 180;
public $age;
// 构造方法
public function __construct(){
$this->age = "Corwien";
// 测试调用静态方法时,不会执行构造方法,只有实例化对象时才会触发构造函数,输出下面的内容。
echo __LINE__,__FILE__,'<br>';
}
static public function tell(){
echo self::$name;//静态方法调用静态属性,使用self关键词
//echo $this->height;//错。静态方法不能调用非静态属性
//因为 $this代表实例化对象,而这里是类,不知道 $this 代表哪个对象
}
public function say(){
echo self::$name . "我说话了";
//普通方法调用静态属性,同样使用self关键词
echo $this->height;
}
}
$p1 = new Human();
$p1->say();
$p1->tell();//对象可以访问静态方法
echo $p1::$name;//对象访问静态属性。不能这么访问$p1->name
//因为静态属性的内存位置不在对象里
Human::say();//错。say()方法有$this时出错;没有$this时能出结果
//但php5.4以上会提示
/*
调用类的静态函数时不会自动调用类的构造函数。
测试方法,在各个函数里分别写上下面的代码 echo __LINE__,__FILE__,'<br>';
根据输出的内容,就知道调用顺序了。
*/
// 调用静态方法,不会执行构造方法,只有实例化对象时才会触发构造函数,输出构造方法里的内容。
Human::tell();
public function scrapePHPUnitDe()
{
$client = new Client();
$crawler = $client->request('GET', 'https://phpunit.de/manual/current/en/index.html');
$toc = $crawler->filter('.toc');
file_put_contents(base_path('resources/docs/').'index.html', $toc->html());
$crawler->filter('.toc > dt a')->each(function($node) use ($client) {
$href = $node->attr('href');
$this->info("Scraped: " . $href);
$crawler = $client->request('GET', $href);
$chapter = $crawler->filter('.col-md-8 .chapter, .col-md-8 .appendix')->html();
file_put_contents(base_path('resources/docs/').$href, $chapter);
});
}
###Laravel 做 App 接口和后台开发 https://github.com/vvXiao/laravel-exa ###Rbac-Laravel 拓展包,轻松搞定权限控制! ###MySQL 5.7 之联合(复合)索引实践 ###对数据进行签名 如果目标数据是个数组,就需要先进行ksort排序,然后在转换为字符串,转换字符串自然就想到用json_encode了。最后进行签名,调用hash_hmac或者私钥签名。 https://www.v2ex.com/t/326285 ###PHP调用phantomjs http://jonnnnyw.github.io/php-phantomjs/4.0 ###PHP 登录 QQ,支付宝等网站 https://github.com/facebook/php-webdriver
namespace App\Helpers;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\WebDriverBy;
class QQHelper
{
static protected $users=[];
static protected $cookieJar;
static protected $host = 'http://localhost:4444/wd/hub';
static protected $driver;
static protected $loginUrl='http://ui.ptlogin2.qq.com/cgi-bin/login?style=9&pt_ttype=1&appid=549000929&pt_no_auth=1&pt_wxtest=1&daid=5&s_url=https%3A%2F%2Fh5.qzone.qq.com%2Fmqzone%2Findex';
static public function login(){
self::$driver = RemoteWebDriver::create(self::$host, DesiredCapabilities::chrome(),5000);
self::$driver->get(self::$loginUrl);
self::$driver->findElement(WebDriverBy::id('guideSkip'))->click();
self::$driver->findElement(WebDriverBy::id("u"))->sendKeys('10000');//账号
self::$driver->findElement(WebDriverBy::id("p"))->sendKeys('password');//密码
self::$driver->findElement(WebDriverBy::id('go'))->click();
self::$cookieJar=self::$driver->manage()->getCookies();
print_r(self::$cookieJar);
//self::$driver->quit();
}
}
https://httpstatuses.com/ ###程序员如何写好简历 && 一份优秀的程序员简历是什么样的? ###优化 centos 服务器
Linux 内存不是用的越少越好, Centos7 版本以前,通常看到的内存 used 比较多是因为包含了 buffer 和 cache 占用
Centos7 版本以后,内存 used 显示数值不包含 buffer 和 cache
Linux 中内存不用白不用,会尽可能的 cache 和 buffer 一些数据,以方便下次使用。
但实际上这些内存大部分也是在应用需要的时候可以释放出来供应用使用。
大部分人在对 linux 做内存优化,都是简单的关闭不使用的服务,调整自己应用的参数来减少内存的占用
因此我也仅通过最简单的方式来介绍下如何调整
关闭服务
=======
Centos7 版本以前可以通过 chkconfig --list 来查看服务列表
找到当前 runlevel 下自启动的服务名,然后通过 chkconfig --level 3 service_name off 关闭指定 RUNLEVEL 下自启动服务
重启后生效或者通过 /etc/init.d/servicce_name stop 的方式来实时生效。
Centos7 以后的版本需要通过 systemctl list-unit-files --type=service --state=enabled 查看自启动服务
通过 systemctl disable service_name 关闭启动
通过 systemctl stop service_name 停止服务运行
调整应用参数
==========
这个部分需要了解自己启动的服务软件简单的工作原理和配置方法
VPS 中安装的 LNMP 环境主要包含三个套件: Nginx, MySQL, php
Nginx
======
工作进程数量直接决定了 Nginx 对内存的占用,平均一个工作进程占用 10~40m 不等
可通过配置文件中 worker_processes 指定
MySQL
======
MySQL 比较复杂,大致可以从全局共享内存使用和线程独享内存使用两个方向入手
全局共享内存可理解为 MySQL 启动的时候就需要分配的全局内存使用
比较明显的是可以调整以下几个参数(但不完全就是以下几个)
key_buffer_size
innodb_buffer_pool_size
innodb_additional_memory_pool_size
innodb_log_buffer_size
query_cache_size
线程独享内存使用可以理解为每个到 MySQL 的链接都会分配一部分内存
read_buffer_size
sort_buffer_size
read_rnd_buffer_size
tmp_table_size
除此之外 MySQL 还有灰常多的参数可以调整影响到内存的使用,可以参考官方文档了
以上列出的参数,也并不是调整了就有效果,因为 MySQL 还有一个重要的东西就是存储引擎
常用的比如 InnoDB , MyISAM 很多参数都是针对存储引擎的,比如你只使用 InnoDB,却调整了 MyISAM 的参数
那也是没有效果的
php
====
由于本人没有搞过 php 所以具体也不清楚详细的调整
php 没有运行在 nginx 下的 module ,所以大部分通过 php-fpm 的方式启动
php-fpm 提供 fastcgi 的协议访问, nginx 再通过 fastcgi 反代到 php-fpm
所以这里的 php-fpm 也是一个多进程应用,也可以通过调整 php-fpm 的启动进程数量来达到控制内存占用的效果
以上这些都是从简单的方面来优化的,但还是那句话,一切看你时机的使用情况,这些参数不是越低越好
比如 nginx 只给 1 个进程。 php-fpm 只给一个进程,在你狂刷浏览器时就会发现你经常会遇到 502 , 503 错误
鉴于在题主是在放在 vps 中的小博客,实在不需要搞到太深度的调优。如果想了解仍可去搜索一些相关的资料:
linux 内核参数调优
linux io 队列调优
nginx 如何通过编译安装精简模块
php 编译安装 精简不必要模块
mysql 编译安装精简存储引擎
###GitBook 使用教程 http://gitbook.zhangjikai.com/ ###pjax 的简单应用 ###服务器抓包 HTTP 的工具 Github: https://github.com/six-ddc/httpflow ### cURL 然后在这个网站能直接转换为 requests 格式 https://curl.trillworks.com/ ###php str_replace替换关键词,如何控制长词优先
$str0 = 'php技术 是时下最好用的 php'; // 替换成 'java技术 是时下最好用的 编程技术'
$str1 = 'php技术';
$str2 = 'php'
// 比较字符串长短,并组合成数组
function compare(){
$vars = func_get_args();
$list = array();
$len = array();
$rel = array();
// 收集长度 + 对照表
foreach ($vars as $k => $v)
{
$l = mb_strlen($v);
$list[$k] = $l;
$len[] = $l;
}
$count = count($len);
// 选择排序:对长度进行比较
for ($i = 0; $i < $count; ++$i)
{
$longest = $i;
for ($n = $i + 1; $n < $count; ++$n)
{
if ($len[$i] < $len[$n]) {
$longest = $n;
}
}
if ($i !== $longest) {
$tmp = $len[$i];
$len[$i] = $len[$longest];
$len[$longest] = $tmp;
}
}
// 搜集整理
foreach ($len as $v)
{
$rel[$v] = $list[$v];
}
// 返回最终结果
return $rel;
}
// 队列方式按照长的先替换
$rel = compare($str1 , $str2);
$replace = array('java' , '编程技术');
for ($i = 0; $i < count($rel); ++$i)
{
$str0 = preg_replace($rel[$i] , $replace[$i] , $str0);
}
通过事件监听来清理token的方法:
将事件注册到 EventServiceProvider 中,代码如下:
protected $listen = [
'App\Events\SomeEvent' => [
'App\Listeners\EventListener',
],
'Laravel\Passport\Events\AccessTokenCreated' => [
'App\Listeners\Auth\RevokeOldTokens',
],
'Laravel\Passport\Events\RefreshTokenCreated' => [
'App\Listeners\Auth\PruneOldTokens',
],
];
###闭包原理
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = (function(index){
return function(){console.log(index)}
})(i)
}
a[6](); // 6
###链式调用
umber.prototype.add=function(num){return Number(this + num)}
Number(10).add(20).add(30)
Number.prototype.add=function(num){return this+num}
(10).add(20)
function a(){
if(arguments.length===1){
//执行某些代码
}else if(arguments.length===2){
//执行另一些代码
}
}
###如何屏蔽页面上所有a标签的跳转 document.querySelectorAll('a').forEach(a => {a.onclick=(e) => {e.preventDefault()}}) ###mysql根据某个字段已存在的值排序
CREATE FUNCTION `sort_col`(`input` VARCHAR(50))
RETURNS VARCHAR(50)
LANGUAGE SQL
NOT DETERMINISTIC
NO SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
declare a int;
declare b int;
declare c int;
set a = cast(substr(input, 3, 3) as int);
set b = cast(substr(input, 9, 3) as int);
set c = cast(substr(input, 15, 3) as int);
if (a <= b && b <= c) then
return concat('["', a, '","', b , '","', c , '"]');
elseif (b <= a && a <= c) then
return concat('["', b, '","', a , '","', c , '"]');
elseif (c <= a && a <= b) then
return concat('["', c, '","', a , '","', b , '"]');
elseif (c <= b && b <= a) then
return concat('["', c, '","', b , '","', a , '"]');
elseif (a <= c && c <= b) then
return concat('["', a, '","', c , '","', b , '"]');
elseif(b <= c && c <= a) then
return concat('["', b, '","', c , '","', a , '"]');
end if;
END
update table_name set values = sort_col(values);
import sys
def afunc():
return 0
s= "afunc"
get_afunc = getattr(sys.modules[__name__], s)
print get_afunc()
###微博第三方登录,授权回掉页面如何获取code? 授权回调页 :必须设置为自己网站的地址,这样就可以接收到了。 ###如何让浏览器文本排版和记事本排版效果一样 放 pre 里,然后使用 monospace 字体。 ###批量替换超大量的html文本
#!/bin/bash
A=($(find . -name '*.html'))
for((i=0;i<${#A[@]};i+=10000))
do
sed -i 's@xxxx@oooo@g' ${A[@]:$i:10000} &
done
wait
find ./ -name "*.html" -exec grep "1234" {} \; -exec sed -i 's/1234/5678/g' {} \;
###python 利用subprocess库调用mplayer
import subprocess
p = subprocess.Popen(["mplayer", "-slave", "-quiet", "/home/pi/Music/爱的翅膀.mp3"], stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False)
p.stdin.write('\n')
print p.stdout.read() //此处
p.stdin.write('get_time_pos\n')
print p.stdout.read()
mplayer播放时会向stout输入大量字符,超过了4096造成死锁,输出信息不在我的需求之中,因此决定修改stdout=open("/dev/null","w")
###Laravel 5.1 如何 migrate 某一个指定的迁移文件 在 database/migrations/ 目录下创建一个新的目录,比如 single/ 将你要 migrate 的那个文件移到上一步创建的 single/ 目录 命令行执行下面的命令: php artisan migrate --path=/database/migrations/single ###touchmove e.preventDefault() 不生效 chrome,或者说再webkit核浏览器里,当你浏览器在一个滚动的状态时,touchmove的cancelable属性被默认置为false,所以preventDefault是不会生效的。
所以要么你在start的时候就阻止,要么就换一种方式去达到你的需求 ###前端预览图片,用Base64和objectURL哪个更好
input.onchange = function(e) {
[...this.files].map(file => {
const img = new Image();
// 方案1 ObjectURL
img.src = window.URL.createObjectURL(new Blob([file], {type: file.type}));
document.body.appendChild(img);
// 方案2 Base64
const reader = new FileReader();
reader.onload = function(e) {
img.src = e.target.result;
document.body.appendChild(img);
}
reader.readAsDataURL(file);
});
}
<div id="copy" data-clipboard-text="Copy Me!">Click to copy</div>
<script src="ZeroClipboard.js"></script> <script> var clip = new
ZeroClipboard( document.getElementById('copy') ); </script>
If you need non-flash support for iOS you just add a fall-back:clip.on( 'noflash', function ( client, args ) {
$("#copy").click(function(){
var txt = $(this).attr('data-clipboard-text');
prompt ("Copy link, then click OK.", txt);
}); });
###POST提交为什么比Get提交数据量大 浏览器及 HTTP 服务器的实现限制了 URL 的长度,从而限制了 GET 能够提交的数据量。
或者你想问同样的数据,你使用 POST 提交会比 GET 提交消耗掉更多的流量?
是会多出那么一点点。你把两种方法的全文写出来就知道啦。多了 Content-Length 和 Content-Type 头 ###求数组2个值的和为6
$arr=[1,5,8,11,44];
for ($i=0;$i<count($arr);$i++){
for ($j=0;$j<count($arr);$j++){
if($arr[$i]+$arr[$j]==6){echo $arr[$i],$arr[$j];echo '<br>';}//5 1
}
}
###根据数据库表接口自动生成restfull 接口 https://github.com/mevdschee/php-crud-api ###php创建文件碰到点问题
/**
* 生成文件 不支持纯数字目录名称
* @param string $path
* @param array $files
* eg: $fileArr = array('dir1'=>'1.html','dir2'=>array('subdir1'=>'2.html','subdir2'=>'3.html','4.html'))
* 生成的文件路径层级如下
* --dir1--1.html
* |
* dir2--subdir1--2.html
* |
* -subdir2--3.html
* |
* -4.html
*/
public static function create($path,array $files)
{
//1. 数字键值,字符串文件名 array('config')
//2. 数字键值,字符串文件目录 array('test.html')
//3. 字符串键值,字符串文件名 array('test'=>'test.txt')
//4. 字符串键值,字符串文件目录 array('test'=>'test1')
//5. 字符串键值,数组文件目录 array('test'=>array('test1'));
$path = str_replace('\\','/',$path); //替换斜杠
if(strrpos($path,'/')!=strlen($path)-1)
{ //检查$path,是否有末尾的'/',若没有则自动添加
$path .= '/';
}
foreach ($files as $key=>$item)
{
$temp = $path;
if(!is_numeric($key))
{
$path .= $key;
mkdir($path);
}
if(is_string($item))
{
$file = $path.'/'.$item;
if(self::hasExt($item))
{
fopen($file,'wb');
}else{
mkdir($file);
}
}
if(is_array($item))
{
self::create($path,$item);
}
$path = $temp;
}
}
/**
* 判断文件名称是否有后缀
* @param string $file
* @return bool 有后缀返回true,否则返回false.
*/
public static function hasExt($file)
{
if(!is_string($file)) return false;
return is_bool(strpos($file,'.'))? false : true;
}
import requests
url = ""
headers = {}
with requests.Session() as s:
s.headers.update(headers)
s.get(url)
s.post(login_url)
$stmt = $db->prepare('SELECT id, title, content FROM posts WHERE id = ?');
$stmt->bind_param('i', $id);
$stmt->execute();
//如果能用get_result,一句就能返回
return $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
//如果不能用get_result,那就得改成下面
$stmt->bind_result($id, $title, $content);
$stmt->store_result();
$rows = array();
$i = 0;
while ($stmt->fetch()) {
$rows[$i]['id'] = $id;
$rows[$i]['post_title'] = $title;
$rows[$i]['post_content'] = $content;
$i++;
}
$stmt->free_result();
$stmt->close();
return $rows;
def getValueUsingPhantomJS(url,cssSelector):
from selenium import webdriver
from time import sleep
driver = webdriver.PhantomJS(executable_path=r'D:\phantomjs-2.1.1-windows\bin\phantomjs.exe')
driver.get(url)
sleep(5)
driver.get_screenshot_as_file('test3.png')
element1 = driver.find_element_by_css_selector(cssSelector)
print(element1.text)
return element1.text
# sellCounter = getValueUsingPhantomJS("https://detail.tmall.com/item.htm?id=535551057548&ns=1&abbucket=0","#J_DetailMeta li.tm-ind-item.tm-ind-sellCount > div > span.tm-count")
sellCounter = getValueUsingPhantomJS("https://item.taobao.com/item.htm?id=543877898669&ns=1&abbucket=0#detail","#J_SellCounter")
print( sellCounter )
也许是lazyload?
加上这句,driver.maximize_window()在最前面 一般都是为了提高网页加载速度,在需要时再加载,最大化时你才能看到那个数字(开始加载),在之前只是一个占位符(I guess)
s1='AATTCCCCCGGGGGAATTAATTAATTAATTAATTGGGGAATTGGGGAATTGGGGAATT's2='AATT'
import re
for i in re.finditer('AATT', s1):
print(i.span())
# coding: utf-8
lst = [1, 1, 1, 2, 3, 4, 4, 5, 5, 6, 7, 7, 7, 7, 8, 9, 9, 9, 10, 99, 99, 99, 100, 100]
intervals = {'{0}-{1}'.format(10 * x + 1, 10 * (x + 1)): 0 for x in range(10)}
for _ in lst:
for interval in intervals:
start, end = tuple(interval.split('-'))
if int(start) <= _ <= int(end):
intervals[interval] += 1
print intervals
name = "AAA'A"
cursor.execute('select * from tb where name=%s',name)
cursor.execute('select * from tb where name=%s',(name))
...
def execute(self, query, args=None):
"""
...
args -- optional sequence or mapping, parameters to use with query.
...
"""
if args is not None:
# 首先判断args是否为字典类型
if isinstance(args, dict):
# 以k-v形式填入查询语句中。
query = query % dict((key, db.literal(item))
for key, item in args.iteritems())
# 当args为非字典类型时
else:
# 遍历args, 最后生成一个元组填入查询语句中。
query = query % tuple([db.literal(item) for item in args])
...
php -a 进入Interactive shell
php > $中国 = '中华人民共和国';
php > echo $中国;
php > echo mb_strlen($中国, 'UTF-8'); //输出7,正确.
php > echo strlen($中国); //输出21,错误.
一般Linux终端编码采用的是UTF-8,执行locale或echo $LANG可见本地语言环境.
https://github.com/borisrepl/boris
###已知外汇牌价折算汇率
for k from 1 to rows(A)
for i from 1 to rows(A)
for j from 1 to rows(A)
if A[i][j] = 0 then
// 货币 i, j 通过货币 k 折算
A[i][j] <- A[i][k] * A[k][j]
end if
###Python+Selenium+PhantomJs爬虫,如何取得新打开页面的源码
for handle in driver.window_handles:
driver.switch_to_window(handle)
from selenium.webdriver.support.ui import WebDriverWait
# 等待新页面生成
WebDriverWait(self.browser, 5).until(
expected_conditions.presence_of_element_located((By.ID, "username")
)
###python发送get请求是否可以只获取状态码而不下载页面内容
heads=requests.head(url)
记得使用 requests.Session,这样对同一服务器的访问可以加速一倍以上。
###python爬取页面时,一个URL无法访问导致报错 curl里面有个可以设置返回header的,如果取到的数据非200状态,直接跳过处理就好了。 ###urllib2.HTTPError: HTTP Error 400: Bad Request
url = 'https://xueqiu.com/stock/f10/finmainindex.json'
user_agent = 'Mozilla/5.0'
values = {'symbol' : 'SZ000001', 'page' : '1','size' : '1' }
headers = { 'User-Agent' : user_agent }
data = urllib.urlencode(values)
print data
request = urllib2.Request(url, data, headers)
print request
response = urllib2.urlopen(request)
page = response.read()
print page
# coding: utf-8
import requests
session = requests.Session()
session.headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}
session.get('https://xueqiu.com')
r = session.get('https://xueqiu.com/stock/f10/finmainindex.json?symbol=SZ000001&page=1&size=1')
print r.text
在访问https://xueqiu.com时需要先获取到相应的cookie信息,后面的页面都需要用到相关的cookie
$ aaa="test_aaa"
$ export bbb="test_bbb"
$ echo $aaa
test_aaa
$ echo $bbb
test_bbb
$ python
Python 2.7.10 (default, Jul 30 2016, 19:40:32)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.getenv("aaa")
>>> os.getenv("bbb")
'test_bbb'
>>> print os.getenv("aaa")
None
>>> print os.getenv("bbb")
test_bbb
>>> '\x61\x62\x63\x64' == 'abcd'
True
>>> ord('a')
97
>>> chr(97)
'a'
不知道这样可不可以满足你的要求
>>> [hex(ord(x)) for x in 'abcd']
['0x61', '0x62', '0x63', '0x64']
import binascii
print(binascii.b2a_hex(b'abcd'))
# b'61626364'
或者 py3.5 直接这样写
print(b'abcd'.hex())
# 61626364
>>> print(''.join((r'\x%2x'%ord(c)for c in 'abcd')))
\x61\x62\x63\x64
>>> print(''.join((r'\x%2x'%c for c in bytes('abcd','l1'))))
\x61\x62\x63\x64
>>> print(''.join((r'\x%2x'%c for c in b'abcd')))
\x61\x62\x63\x64
import csv
csvfile = open('csvtest.csv', 'wb')#csvfile = open('csvtest.csv', 'w')
writer = csv.writer(csvfile)
writer.writerow(['id', 'url', 'keywords'])
data = [
('1', 'http://www.xiaoheiseo.com/', '小黑'),
('2', 'http://www.baidu.com/', '百度'),
('3', 'http://www.jd.com/', '京东')
]
writer.writerows(data)
csvfile.close()
>>> d = {u'subType': u'\u5f55\u97f3\u5ba4\u7248',
u'name': u'\u5468\u6770\u4f26\u7684\u5e8a\u8fb9\u6545\u4e8b'}
>>> print d
{u'subType': u'\u5f55\u97f3\u5ba4\u7248',
u'name': u'\u5468\u6770\u4f26\u7684\u5e8a\u8fb9\u6545\u4e8b'}
>>> for i in d:
... print i
...
subType
name
import json
d = {u'subType': u'\u5f55\u97f3\u5ba4\u7248',
u'name': u'\u5468\u6770\u4f26\u7684\u5e8a\u8fb9\u6545\u4e8b'}
print(json.dumps(d,ensure_ascii=False,indent=1,encoding="UTF-8"))
###python ImportError: No module named '***'
>>> import numpy as np
>>> import tensorflow as tf
>>>
sudo python demo.py和python demo.py不一样,sudo一般代表系统默认的python环境
[~]$ which python
/usr/local/bin/python
[~]$ sudo which python
/usr/bin/python
###for计算斐波那契数列
fibs = [0,1]
for i in range(8):
fibs.append(fibs[-2] + fibs[-1])
print(fibs)
如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代。迭代是通过 for ... in 来完成的。range(8)是一个list[0, 1, 2, 3, 4, 5, 6, 7],i是个变量,每一轮从ragne(8)里面取出一个数参与后面的操作,这个循环一共取数八轮(0~7)8个数。
###soup.select 返回的是符合条件的列表(list)
deal_way = list(soup.select('div.biaoqian_li').stripped_strings)
#
deal_ways = soup.select('div.biaoqian_li')
for deal_way in deal_ways:
x = list(deal_way.stripped_strings)
soup.select 返回的是符合条件的列表(list),列表当然没有那个属性(因为那个属性是bs4 Tag对象上的属性)
而下面可以是因为列表里面的元素就是Tag对象
list(soup.select('div.biaoqian_li')[0].stripped_strings)
print dict([(i,count_times.count(i)) for i in set(count_times)])
In [1]: b, a = {}, [1, 2, 3, 4, 5, 6]
In [2]: [b.update({key: b[key] + 1}) if key in b.keys() else b.update({key: 1}) for key in a]
Out[2]: [None, None, None, None, None, None]
In [3]: b
Out[3]: {1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1}
###Laravel 如何获取路由名称 Route::resource('photo', 'PhotoController');
//GET /photos index //GET /photos/create create //POST /photos store //GET /photos/{photo} show //GET /photos/{photo}/edit edit //PUT/PATCH /photos/{photo} update //DELETE /photos/{photo} destroy Route::currentRouteName() ###laravel里面一个controller中的方法要调用另一个controller $ctrl = \App::make(\App\Http\Controllers\AaaController::class); \App::call([$ctrl, "aaa"]); ###laravel的“门面”和“契约”的问题 外观(你说的门面)是外观模式的实现。 协议(你说的契约)是工厂方法模式或抽象工厂模式的实现。
阅读一下设计模式,你能收货不少。 ###laravel5.2 多个条件模糊查询+多个orWhere语句
A::where(function ($query) {
$query->where('a', 1)->where('b', 'like', '%123%');
})->orWhere(function ($query) {
$query->where('a', 1)->where('b', 'like', '%456%');
})->get();
###laravel什么时候要把写的东西放到服务提供者里面去 在服务提供者把服务放进服务容器。 https://segmentfault.com/q/1010000008397464 ###laravel 使用 表单和HTML扩展包有什么好处 代替你处理一部分内容,例如防止跨站的token
###[MySQL 联合查询并更新到另一个表](https://segmentfault.com/q/1010000008497433) insert into account(uid,balance) (select uid, balance from wp_accountinfo) on duplicate key update balance=column(blance); ###[求解一个mysql查询问题](https://segmentfault.com/q/1010000008437012) select catid,title from table2 where FIND_IN_SET(catid, select arrchildid from table1 where catid = 6) ###[mysql中查询条件的先后顺序问题](https://segmentfault.com/q/1010000008429400) ```js CREATE TABLE `user_customer` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID号', `uid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '人员ID号', `cid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '客户ID号', PRIMARY KEY (`id`), KEY `uid_cid` (`uid`,`cid`) ) ENGINE=InnoDB AUTO_INCREMENT=18227 DEFAULT CHARSET=utf8 select count(1) from user_customer where uid > 1500 and cid > 1000000; select count(1) from user_customer where cid > 1000000 and uid > 1500; ``` ###[如何解决where name like '%%' 当name 为null时,查询不到数据](https://segmentfault.com/q/1010000008413478) ###[千万级数据表如何有效的变更字段](https://segmentfault.com/q/1010000008444360) 目前采用的方法如下: 1、将A表的数据导出到一个临时文件中tmp.unl 2、新建一张临时表Atmp,最好是无日志类型的 3、将tmp.unl中的数据导入到Atmp表中 4、删除表A 5、将Atmp表更名为A 6、将表A设置为标准表,同时为Atmp增加索引 ###[mysql group by 优化的问题](https://segmentfault.com/q/1010000008445575) 把表A(8千万行)复制一个表结构,产生一张空表B; 对B的ciphertext列做唯一索引; 遍历表A的每一行,插入到表B,可以用REPLACE或INSERT INTO ... ON DUPLICATE KEY UPDATE ... 校验表B的数据,如果结果正确,则删除表A,把表B重命名为表A。 ###[数据库JOIN查询](https://segmentfault.com/q/1010000008447610) ```jsdrop table if exists article; drop table if exists category; drop table if exists r_ac;
create table article( id serial not null, title varchar(100), expire timestamp, primary key(id) );
create table category( id serial not null, name varchar(50), primary key(id) );
create table r_ac( article int not null, category int not null, primary key(article, category) );
insert into article(title, expire) values ('a', '2017-05-20'),('b', null),('c', '2017-03-04'),('d', '2017-02-23'),('e', '2017-04-23'),('f', '2016-09-15'),('g', '2017-06-09'); insert into category(name) values ('c1'),('c2'),('c3'),('c4'),('c5'),('c6'),('c7'); insert into r_ac (article, category) values (1, 1), (1, 2), (1, 5), (1, 7), (2, 1), (2, 6), (3, 5), (4, 1), (4, 4), (7, 1), (7, 7);
select category, c.name, count(1) as c from r_ac as ac inner join ( select id, title, expire from article where expire is null or expire>now() ) as z on ac.article=z.id left join category as c on ac.category=c.id group by category, c.name;
###[一次性的update MYSQL](https://segmentfault.com/q/1010000008475543)
```js
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method='post'>
<?php
//假设这是一个从数据库获取的用户ID集合
$user_list = [
['id'=>1],
['id'=>2],
['id'=>3],
['id'=>4],
];
//将表单循环显示出来
foreach($user_list as $key => $val){
$id = $val['id'];
?>
<!-- 注意这里的name属性 -->
<input name='user[]' type='text' value='<?php echo $id; ?>' />
<?php
}
?>
<!-- 提交按钮 -->
<input name='submit' type='submit' value='提交'>
<?php
//这里是接收到post请求是处理的过程
if (isset($_POST['submit'])) {
$user_list = $_POST['user']; //这里的表单名,但是不需要中括号'[]'
var_dump($user_list);
}
?>
</form>
###mysql安装密码
vim /etc/my.cnf
# 添加下面的字段
skip-grant-tables
mysql> update user set mysql>authentication_string=PASSWORD('123456') where User='root';
mysql>flush privileges;
vim /etc/my.cnf
# 添加下面的字段
skip-grant-tables
mysql> use mysql;
mysql> update user set password=PASSWORD("password") where User='root';
mysql> flush privileges;
[root@YFPUNzLr ~]# grep 'temporary password' /var/log/mysqld.log
2017-02-15T14:31:05.449058Z 1 [Note] A temporary password is generated for root@localhost: 3NeI3PuNwa%j
[root@YFPUNzLr ~]# mysql -uroot -p
$url = 'https://www.xxx.com/xxx.mp3';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
$url = 'https://www.baidu.com/';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$output = curl_exec($ch);
if (!$output) {
echo curl_error($ch);
} else {
var_dump($output);
}
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, false);
$date = new \DateTime("2016-11-25 09:53:58");
$date->add(new \DateInterval('PT10S'));
// 输出为 2016-11-25 09:54:08
echo $date->format('Y-m-d H:i:s');
function steamroller(arr) {
// I'm a steamroller, baby
var newArr = [];
console.log("steam"+arr) //这里为什么第一次结果是对的?
for (var i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
//console.log(arr[i])
steamroller(arr[i]);
} else {
newArr = newArr.concat(arr[i]);
}
}
//console.log(newArr)
return newArr
}
steamroller([1, [2], [3, [[4]]]]);
function steamroller(arr) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
// 如果是数组,调用(递归)steamroller 将其扁平化
// 然后再 push 到 newArr 中
newArr.push.apply(newArr, steamroller(arr[i]));
} else {
// 不是数组直接 push 到 newArr 中
newArr.push(arr[i]);
}
}
return newArr;
}
var source = [1, [2], [3, [[4]]]];
var r = steamroller(source);
console.log(source);
console.log(r);
git blame filepath | grep 'code'
or
git blame filepath | grep 'lineNO)'
###warning:LF will be replaced by CRLF in
$ git config --global core.autocrlf true
<?php
$arr = array(1,1,1,2,2,2,3,3,3,3,4,5,6,6,6);
function fsort($ss){
$result = array($ss[0]);
$overage = array();
$num = 1;
for($i=1, $len=count($ss); $i<$len; $i++){
if( $ss[$i]==$ss[$i-1] ){
if( $num<2 ){
$result[] = $ss[$i];
$num++;
}else{
$overage[] = $ss[$i];
}
}else{
$result[] = $ss[$i];
$num=1;
}
}
return array_merge($result, $overage);
}
echo "<pre>";
print_r( fsort($arr) );
<?php
$arr = array(1,1,1,2,2,2,3,3,3,3,4,5,6,6,6);
$result = array();
foreach($arr as $key => $value) {
if(isset($result[$value]) && count($result[$value]) >= 3) {
unset($arr[$key]);
continue;
}
$result[$value][] = $value;
}
var_dump($arr);die;
//反选
$('[name=items]:checkbox').prop('checked', function(idx, val){ return !val; })
function mb_str_split( $string ) {
# Split at all position not after the start: ^
# and not before the end: $
return preg_split('/(?<!^)(?!$)/u', $string );
}
server {
listen 88;
server_name test.test.com;
charset utf-8;
index index.php # 全局
###当配置中有多个域名是,请使用 $_SERVER['HTTP_HOST'] 获得当前使用的域名
$_SERVER['SERVER_NAME'] 获取的是web服务器中配置的域名
$_SERVER['HTTP_HOST'] 获取的是,用户访问时的域名
队列https://github.com/pda/pheanstalk
###用php或nodejs异步通知 nodejs+socket.io+php完全能实现!
node监听在一个端口上,客户端访问页面,通过websocket接收消息。像聊天室一样 do { $data = []; // 读取Excel代码,读取完之后是个数组没问题吧 curl();// 使用CURL将数据传输到异步通知地址 sleep(3600);// 休眠一小时 } while(true); ###PHP正则姓名如何加*号
mb_regex_encoding("utf-8");
echo mb_ereg_replace_callback("^(\w{1})(\w{1})(\w*)$",function($matches){return $matches[1]."*".$matches[3];},"王小明");
###app版本自动更新 服务器提供一个拉取当前最新版本的app信息接口,该接口拉取的数据至少需要 1)版本号 2)该版本下载地址 更多的时候还要包括 3)渠道类型 4)升级说明
app端通过某种机制(如用户主动点击检查更新按钮、定时检查是否有新版本),请求上面的那个接口,根据拉取的信息,与本地的版本号(或其他的信息)对比,如果拉取的版本号更高,则通过下载地址下载新的版本,否则什么都不做,等待下一次拉取。
以上 ###$fp = fsockopen($host, $port, $errno, $errstr, 3) 提示说的“怎么找到打开的文件” 说的是实体文件吧? 你这是打开的socket描述符是没有实体文件的,在内存中吧。 如果在linux上查看一个进程打开的哪些文件资源,可以使用 lsof -p PID 命令。该命名可以显示出进程打开的文件文件句柄、网络句柄还有一个库文件。 这里的$fp指的是一个网络文件(资源) ###三维数组重组
<?php
$arr = array("photo" => array(
"name" => array(
0 => "221.png",
1 => "2211.png",
2 => "545843ec763cf.jpg",
),
"type" => array(
0 => "image/png",
1 => "image/png",
2 => "image/jpeg",
),
"tmp_name" => array(
0 => "C:\Windows\Temp\php55FF.tmp",
1 => "C:\Windows\Temp\php5600.tmp",
2 => "C:\Windows\Temp\php5601.tmp",
),
"error" => array(
0 => 0,
1 => 0,
2 => 0,
),
"size" => array(
0 => 8353,
1 => 8194,
2 => 527569,
)
));
$result = array();
foreach (current($arr) as $key => $value) {
foreach ($value as $k => $val) {
$result[$k][$key] = $val;
}
}
var_dump($result);die;
$files = [];
for($i=0;i<count($photo['name']);$i++)
{
$files[] = [
'name'=>$photo['name'],
'type'=>$photo['type'],
'tmp_name'=>$photo['tmp_name'],
'error'=>$photo['error'],
'size'=>$photo['size']
];
}
<?php
function begin(&$start) {
$tmp = gettimeofday();
$start = $tmp[usec];
}
function report($start) {
$tmp = gettimeofday();
$now = $tmp[usec];
echo "time consuming: ";
echo $now - $start;
echo "<br>";
}
function getRandNum($length = 8) {
$salt = substr(uniqid(rand()), -$length);
return $salt;
}
$start = 0;
begin($start);
$str="";
while (strlen($str)< 10000)
{
$str.=getRandNum(1);
}
report($start);
###修改php.ini后重启nginx也不生效 sudo kill -USR2 $(pgrep php-fpm) ###如何计算中奖概率问题
/**
* 抽奖函数
*
* $i:传中奖概率过来,也就是百分比中的分子
* return 1|0
*/
function choujiang($i)
{
$group = array_fill(0, $i, 1) + array_fill(0, 100, 0);
$num = mt_rand(0, 99);
shuffle($group);
return $group[$num];
}
echo choujiang(65) ? '中奖了' : '没中奖';
直接mt_rand(1, 100) <= $prob不就得了
###php中的 static
class father {
static public function fatherF(){
echo "我在父类中哦";
}
}
class oneself extends father{
public function start(){
// return self::fatherF();
return static::fatherF();
// return self::oneselfF();
}
static public function oneselfF(){
echo "我在儿子类中哦";
}
}
echo PHP_VERSION; // 版本
$c = new oneself;
$c->start();
/*
+----------------------------------------------------------------------
| 5.6.29 我在父类中哦
+----------------------------------------------------------------------
*/
###滴滴打车上面的手机号加密
这个问题看起来简单,其实涉及的东西很多,不单单是程序方面,还有运营商落地和规则。
我们说的电话号码看起来只是一串数字,但这些数字并不是你想怎么显示就怎么显示的。早期运营商为了业绩,可以开通透传功能,然后通过某些通信系统可以修改主叫号码来达到更改显示号码的情况,但这也是要在运营商规定的范围内(比如你接的联通的运营商,你可以把你的主叫显示成任意的联通号码,但如果你显示成移动的号码就不能呼出了)。
滴滴的号码不是把你的手机号码加密,而是司机呼叫你的时候,其实是先呼叫到虚拟运营商那里,虚拟运营商在转接给你达成的。
PS:我就是做VOIP的,所以我做过类似的玩意。
static function reader($file) {
if (self::_getExt($file) == 'xls') {
import("Tools.Excel.PHPExcel.Reader.Excel5");
$PHPReader = new \PHPExcel_Reader_Excel5();
} elseif (self::_getExt($file) == 'xlsx') {
import("Tools.Excel.PHPExcel.Reader.Excel2007");
$PHPReader = new \PHPExcel_Reader_Excel2007();
} else {
return '路径出错';
}
$PHPExcel = $PHPReader->load($file);
$currentSheet = $PHPExcel->getSheet(0);
$allColumn = $currentSheet->getHighestColumn();
$allRow = $currentSheet->getHighestRow();
$allColumn++;
//$allRow变量是有多少行
for($b = 1;$b < $allRow; $b++){
//$allColumn变量是有多少列
for($i='A'; $i!=$allColumn; $i++){
$address = $i.$b;
$arr[$b][$i] = $currentSheet->getCell($address)->getValue();
}
}
return $arr;
}
###php脚本编码规范的工具 https://github.com/squizlabs/PHP_CodeSniffer https://segmentfault.com/a/1190000004162229 https://segmentfault.com/q/1010000008408776 https://segmentfault.com/q/1010000008308957 https://segmentfault.com/q/1010000008424035 https://segmentfault.com/q/1010000008410829 https://segmentfault.com/q/1010000008425937 https://segmentfault.com/q/1010000008412879 https://segmentfault.com/q/1010000008416813 ###短网址的生成原理 0-9 a-z A-Z 你看看主流的短连接是几位的 每一位随机取 基本不会重复 保险起见数据库查一遍是否重复,然后key和url存入数据库,前期量小的话 很简单 直接根据key取url然后重定向,后期访问压力大了,基本就是读压力,前端档一个缓存就好了
function get_last_number() {
$db_result = mysql_query("SELECT last_number FROM ".DB_PREFIX."settings") or db_die(__FILE__, __LINE__, mysql_error());
$db_row = mysql_fetch_row($db_result);
return $db_row[0];
}
function increase_last_number() {
mysql_query("UPDATE ".DB_PREFIX."settings SET last_number = (last_number + 1)") or db_die(__FILE__, __LINE__, mysql_error());
return (mysql_affected_rows() > 0) ? true : false;
}
function generate_code($number) {
$out = "";
$codes = "abcdefghjkmnpqrstuvwxyz23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
while ($number > 53) {
$key = $number % 54;
$number = floor($number / 54) - 1;
$out = $codes{$key}.$out;
}
return $codes{$number}.$out;
}
function insert_url($url, $code) {
mysql_query("INSERT INTO ".DB_PREFIX."urls (url, code, date_added) VALUES ('$url', '$code', NOW()") or db_die(__FILE__, __LINE__, mysql_error());
return mysql_insert_id();
}
###关于函数mt_getrandmax
系统一般会有最大能产生的随机数值LIMIT_RAND_MAX,比如2^31-1,而mt_getrandmax()返回的就是系统默认的这个值。使用情境应该是这样的:
1、使用mt_getrandmax()函数获取系统能产生的最大随机数值LIMIT_RAND_MAX 2、根据LIMIT_RAND_MAX来判定自己所需的随机数是否在这个范围 3、使用mt_rand()产生随机数
总的来说,mt_getrandmax()仅仅是用来做范围衡量作用