baidu120 - php
type: channel
link: http://blog.baidu120.cc/category/php
description: php notes
items: think-swoole.v4.0.8
items: ThinkAdmin 代码生成器
items: ThinkAdmin 常用代码
items: xdebug 配置
items: swoole学习demo
items: php GD库 常用图片操作类
items: php总结
items: PHP对redis操作详解
items: PHP操作MongoDB（增删改查）
items: php设置跨域

think-swoole.v4.0.8
type: item
date: 2022-12-25T13:49:00+08:00
description: Watcher.php<?php namespace think\swoole; use think\swoole\watcher\Driver; /** * @mixin Driver */ class Watcher extends \think\Manager { protected $namespace = '\\think\\swoole\\watcher\\'; protected function getConfig(string $name, $default = null) { return $this->app->config->get('swoole.hot_update.' . $name, $default); } protected function resolveParams($name): array { return [ $this->getConfig('include', []), $this->getConfig('exclude', []), $this->getConfig('name', []), ]; } public function getDefaultDriver() { return $this->getConfig('type', 'scan'); } } Websocket.php<?php namespace think\swoole; use Swoole\Http\Response; use think\Event; use think\swoole\websocket\Pusher; use think\swoole\websocket\Room; /** * Class Websocket */ class Websocket { /** * @var \think\App */ protected $app; /** * @var Room */ protected $room; /** * Scoket sender's fd. * * @var string */ protected $sender; /** @var Event */ protected $event; /** @var Response */ protected $client; /** * Websocket constructor. * * @param \think\App $app * @param Room $room * @param Event $event */ public function __construct(\think\App $app, Room $room, Event $event) { $this->app = $app; $this->room = $room; $this->event = $event; } /** * @return Pusher */ protected function makePusher() { return $this->app->invokeClass(Pusher::class); } public function to(...$values) { return $this->makePusher()->to(...$values); } public function push($data) { $this->makePusher()->to($this->getSender())->push($data); } public function emit(string $event, ...$data) { $this->makePusher()->to($this->getSender())->emit($event, ...$data); } /** * Join sender to multiple rooms. * * @param string|integer|array $rooms * * @return $this */ public function join($rooms): self { $rooms = is_string($rooms) || is_int($rooms) ? func_get_args() : $rooms; $this->room->add($this->getSender(), $rooms); return $this; } /** * Make sender leave multiple rooms. * * @param array|string|integer $rooms * * @return $this */ public function l…

ThinkAdmin 代码生成器
type: item
date: 2022-11-11T14:54:00+08:00
description: 使用方法:php think code 表 模块儿 路径codesys.php<?php use app\code\command\Controller; use think\Console; $app = app(); if ($app->request->isCli()) { // 动态注册操作指令 Console::starting(function (Console $console) { $console->addCommand(Controller::class); }); } else { }tplindex_search.html 换行位置 条件搜索 换行位置 url()}{/literal}" autocomplete="off" class="layui-form layui-form-pane form-search" method="get" onsubmit="return false"> {foreach $info['columns'] as $k=>$v}换行位置 换行位置 {$v['COLUMN_COMMENT']} 换行位置 {if in_array($v['COLUMN_NAME'],$info['search']['like'])} 换行位置 换行位置 换行位置 {elseif in_array($v['COLUMN_NAME'],$info['search']['equal']) /} 换行位置 -- 全部 -- 换行位置 {literal}{foreach ['0','1'] as $k=>$v}{/literal}换行位置 {literal}{if $k.'' eq input('{/literal}{$v['COLUMN_NAME']}{literal}')}{/literal}换行位置 {literal}{$v}{/literal} 换行位置 {literal}{else}{/literal}换行位置 {literal}{$v}{/literal} 换行位置 {literal}{/if}{/literal}{literal}{/foreach}{/literal}换行位置 {elseif in_array($v['COLUMN_NAME'],$info['search']['between']) /} 换行位置 换行位置 {else /} 换行位置 换行位置 换行位置 {/if} 换行位置 {/foreach} 换行位置  搜 索 换行位置 换行位置 换行位置 换行位置 form.html url()}{/literal}" autocomplete="off" class="layui-form layui-card" data-auto="true" method="post">换行位置 换行位置 {foreach $info['columns'] as $k=>$v} {if $v['COLUMN_NAME']===$info['pk']} {literal}{notempty name='vo.id'} {/notempty}{/literal}换行位置 {else/} {if in_array($v['COLUMN_NAME'],$info['add']['input'])} 换行位置 {$v['COLUMN_COMMENT']}换行位置 {:ucwords($v['COLUMN_NAME'])}换行位置 换行位置 提示，请填写{$v['COLUMN_COMMENT']}换行位置 换行位置 {elseif in_array($v['COLUMN_NAME'],$info['add']['time']) /}换行位置 换行位置 {$v['COLUMN_COMMENT']}换行位置 {:ucwords($v['COLUMN_NAME'])}换行位置 换行位置 换行位置 提示，请填写{$v['COLUMN_COMMENT']}换行位置 换行位置 {elseif in_array($v['COLUMN_NAME'],$info['add']['select']) /} 换行位置 {$v['COLUMN_COMMENT']}换行位置 {:ucwords($v['COLUMN_NAME'])}换行位置 换行位置 -- 全部 -- 换行位置 {literal}{foreach ['0','1'] as $k=>$v}{/literal}换行位置 {literal}{if $k.'' eq input('{/literal}{$v['COLUMN_NAME']}{literal}')}{/literal} {literal}{$v}{/literal} 换行位置 {literal}…

ThinkAdmin 常用代码
type: item
date: 2022-01-13T10:57:00+08:00
description: 数据列表操作启用、禁用 禁 用 激 活 多选表格头 表格行 排序表头 刷 新 表行 url()}" data-loading="false" data-value="id#{$vo.id};action#sort;sort#{value}" value="{$vo.sort}"> 爬虫 标题:{{=d.title}} 链接:{{=d.href}} 操作:删除 angluar操作例子 序号 是否正确 答案内容 添加 正确 错误 保存数据 取消编辑

xdebug 配置
type: item
date: 2020-09-20T18:49:00+08:00
description: xdebug 配置php.inixdebug 2.0配置[xdebug] xdebug.remote_enable=On xdebug.remote_autostart=Off xdebug.remote_handler=dbgp xdebug.remote_host=192.168.1.105 (开发环境地址) xdebug.remote_port=10010 (开发环境端口) xdebug.idekey=PHPSTORMxdebug 3.0配置[xdebug] # xdebug.remote_enable=On xdebug.start_with_request=yes xdebug.discover_client_host=true xdebug.remote_cookie_expire_time = 3600 xdebug.remote_autostart=Off xdebug.remote_handler=dbgp xdebug.client_host=192.168.101.4 xdebug.client_port=10010 xdebug.idekey=PHPSTORM xdebug.mode = debug配置完一定要重启fpmphpstorm 配置Break at first line in PHP Scripts Off 禁用 不然调试一直弹出 Languages Frameworks -> php -> debug -> xdebug prot 10010 Languages Frameworks -> php -> debug -> xdebug -> DBGp Proxy# DBGp Proxy key:PHPSTORM host:ti001.lan.baidu120.cc port:10010Languages Frameworks -> php -> debug -> xdebug -> servers# xdebug -> servers name:ti001.lan.baidu120.cc 访问域名 host:ti001.lan.baidu120.cc 访问域名 port:80 域名端口号 use maping path D:\docker.dev\www\dev.ti001.com /www/wwwroot/dev.ti001.comEdit configurations -> php remote debug# Edit configurations -> php remote debug name:ti001.lan.baidu120.cc On filter debug connection by ide key server:ti001.lan.baidu120.cc IDE key: PHPSTORMpostman 配置Cookie:XDEBUG_SESSION=PHPSTORM;

swoole学习demo
type: item
date: 2019-11-23T22:21:00+08:00
description: clienttcp_client.php<?php // 连接 swoole tcp 服务 $client = new swoole_client(SWOOLE_SOCK_TCP); if(!$client->connect("127.0.0.1", 9501)) { echo "连接失败"; exit; } /// php cli常量 fwrite(STDOUT, "请输入消息:"); $msg = trim(fgets(STDIN)); // 发送消息给 tcp server服务器 $client->send($msg); // 接受来自server 的数据 $result = $client->recv(); echo $result;coroutineredis.php<?php $http = new swoole_http_server('0.0.0.0', 8001); $http->on('request', function($request, $response) { // 获取redis 里面 的key的内容， 然后输出浏览器 $redis = new Swoole\Coroutine\Redis(); $redis->connect('127.0.0.1', 6379); $value = $redis->get($request->get['a']); $response->header("Content-Type", "text/plain"); $response->end($value); }); $http->start();io1.log20180306 18:08:4320180306 18:10:0720180306 18:10:0920180306 18:10:0920180306 18:10:39 20180306 18:10:401.txttest-iomysql.php<?php class AysMysql { /** * @var string */ public $dbSource = ""; /** * mysql的配置 * @var array */ public $dbConfig = []; public function __construct() { //new swoole_mysql; $this->dbSource = new Swoole\Mysql; $this->dbConfig = [ 'host' => '127.0.0.1', 'port' => 5123, 'user' => 'root', 'password' => 123456, 'database' => 'swoole', 'charset' => 'utf8', ]; } public function update() { } public function add() { } /** * mysql 执行逻辑 * @param $id * @param $username * @return bool */ public function execute($id, $username) { // connect $this->dbSource->connect($this->dbConfig, function($db, $result) use($id, $username) { echo "mysql-connect".PHP_EOL; if($result === false) { var_dump($db->connect_error); // todo } //$sql = "select * from test where id=1"; $sql = "update test set `username` = '".$username."' where id=".$id; // insert into // query (add select update delete) $db->query($sql, function($db, $result){ // select => result返回的是 查询的结果内容 if($result === false) { // todo var_dump($db->error); }elseif($result === true) {// add update delete // todo var_dump($db->affected_rows); }else { print_r($result); } $db->close(); }); }); return true; } } $obj = new AysMysql();…

php GD库 常用图片操作类
type: item
date: 2019-07-05T18:17:00+08:00
description: class Img { private static $instance; /** * 初始化 * @access public * @param array $options 参数 * @return Img */ public static function instance($options = []) { if (is_null(self::$instance)) { self::$instance = new static($options); } return self::$instance; } /** * 调整 头像大小 * @param $imgSource * @param $maxwidth * @param $maxheight * @return resource */ public function resizeImage(&$imgSource, $maxwidth, $maxheight) { $width = imagesx($imgSource); $height = imagesx($imgSource); $bgSource = imagecreatetruecolor($maxwidth, $maxheight); // 创建一个真彩色图像 我把它理解为创建了一个画布 imagecopyresampled($bgSource, $imgSource, 0, 0, 0, 0, $maxwidth, $maxheight, $width, $height); return $bgSource; } /** * 获取图片资源 * @param $imgPath * return resource images */ public function getSource($imgPath) { $ext = pathinfo($imgPath); switch ($ext['extension']) { case 'jpg': $imgSource = imagecreatefromjpeg($imgPath); break; case 'png': $imgSource = imagecreatefrompng($imgPath); break; case 'jpeg': $imgSource = imagecreatefromjpeg($imgPath); break; case 'wbmp': $imgSource = imagecreatefromwbmp($imgPath); break; case 'gif': $imgSource = imagecreatefromgif($imgPath); break; } return $imgSource; } /** * 处理成圆图片,如果图片不是正方形就取最小边的圆半径,从左边开始剪切成圆形 * * @param $imgSource * @param null $width * @param null $height * @param bool $return * @return resource */ public function circular(&$imgSource) { $w = imagesx($imgSource); $h = imagesy($imgSource); $w = min($w, $h); $h = $w; $returnSource = imagecreatetruecolor($w, $h); //这一句一定要有 imagesavealpha($returnSource, true); //拾取一个完全透明的颜色,最后一个参数127为全透明 $bg = imagecolorallocatealpha($returnSource, 255, 255, 255, 127); imagefill($returnSource, 0, 0, $bg); $r = $w / 2; //圆半径 for ($x = 0; $x < $w; $x++) { for ($y = 0; $y < $h; $y++) { $rgbColor = imagecolorat($imgSource, $x, $y); if (((($x - $r) * ($x - $r) + ($y - $r) * ($y - $r)) < ($r * $r))) { imagesetpixel($returnSource, $x, $y, $rgbColor); } } } return $returnSource; } /** * 合并图片. * @param string $bgSource * @param string $smSourc…

php总结
type: item
date: 2019-03-25T10:57:00+08:00
description: 数组随机取function array_random ($number, $ary) { // @number 需要取多少个元素 // @ary 原数组 $final = []; while (count($final) < $number) { $element = $ary[array_rand($ary, 1)]; in_array($element, $final) OR $final[] = $element; } return $final; } // $number 要小于 数组长度 $number < count($ary); $final = array_random(3, $ary); $ary = ['php', 'java', 'python', 'c#', 'c++', 'ruby']; print_r($final);

PHP对redis操作详解
type: item
date: 2019-03-25T10:53:00+08:00
description: 1.Connection$redis = new Redis(); $redis->connect('127.0.0.1',6379,1);//短链接，本地host，端口为6379，超过1秒放弃链接 $redis->open('127.0.0.1',6379,1);//短链接(同上) $redis->pconnect('127.0.0.1',6379,1);//长链接，本地host，端口为6379，超过1秒放弃链接 $redis->popen('127.0.0.1',6379,1);//长链接(同上) $redis->auth('password');//登录验证密码，返回【true | false】 $redis->select(0);//选择redis库,0~15 共16个库 $redis->close();//释放资源 $redis->ping(); //检查是否还再链接,[+pong] $redis->ttl('key');//查看失效时间[-1 | timestamps] $redis->persist('key');//移除失效时间[ 1 | 0] $redis->sort('key',[$array]);//返回或保存给定列表、集合、有序集合key中经过排序的元素，$array为参数limit等！【配合$array很强大】 [array|false]2.共性的运算归类$redis->expire('key',10);//设置失效时间[true | false] $redis->move('key',15);//把当前库中的key移动到15库中[0|1] //string $redis->strlen('key');//获取当前key的长度 $redis->append('key','string');//把string追加到key现有的value中[追加后的个数] $redis->incr('key');//自增1，如不存在key,赋值为1(只对整数有效,存储以10进制64位，redis中为str)[new_num | false] $redis->incrby('key',$num);//自增$num,不存在为赋值,值需为整数[new_num | false] $redis->decr('key');//自减1，[new_num | false] $redis->decrby('key',$num);//自减$num，[ new_num | false] $redis->setex('key',10,'value');//key=value，有效期为10秒[true] //list $redis->llen('key');//返回列表key的长度,不存在key返回0， [ len | 0] //set $redis->scard('key');//返回集合key的基数(集合中元素的数量)。[num | 0] $redis->sMove('key1', 'key2', 'member');//移动，将member元素从key1集合移动到key2集合。[1 | 0] //Zset $redis->zcard('key');//返回集合key的基数(集合中元素的数量)。[num | 0] $redis->zcount('key',0,-1);//返回有序集key中，score值在min和max之间(默认包括score值等于min或max)的成员。[num | 0] //hash $redis->hexists('key','field');//查看hash中是否存在field,[1 | 0] $redis->hincrby('key','field',$int_num);//为哈希表key中的域field的值加上量(+|-)num,[new_num | false] $redis->hlen('key');//返回哈希表key中域的数量。[ num | 0]3.Server$redis->dbSize();//返回当前库中的key的个数 $redis->flushAll();//清空整个redis[总true] $redis->flushDB();//清空当前redis库[总true] $redis->save();//同步??把数据存储到磁盘-dump.rdb[true] $redis->bgsave();//异步？？把数据存储到磁盘-dump.rdb[true] $redis->info();//查询当前redis的状态 [verson:2.4.5....] $redis->lastSave();//上次存储时间key的时间[timestamp] $redis->watch('key','keyn');//监视一…

PHP操作MongoDB（增删改查）
type: item
date: 2019-03-22T17:31:00+08:00
description: MongoDB的PHP驱动提供了一些核心类来操作MongoDB，总的来说MongoDB命令行中有的功能，它都可以实现，而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同，本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作，最后再简单说明一下PHP7以后版本对MongoDB的操作。PHP5一、数据插入//insert() //参数1：一个数组或对象 //参数2：扩展选项 // fsync：默认为false，若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘 // j：默认为false，若为true则mongo在确认数据插入成功之前将会强制把数据写入日志 // w：默认为1，写操作会被（主）服务器确认，若为0则将不会得到确认，使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认 // wtimeout：默认为10000（毫秒），用于指定服务器等待接收确认的时间 // timeout：指定客户端需要等待服务器响应的超时时间（毫秒） $mongo = new MongoClient('mongodb://localhost:27017'); $db = $mongo->mf;//选择数据库 $collection = $db->friend;//选择文档集合 $doc = [//定义一个文档，即一个数组 'First Name' => 'Jet', 'Last Name' => 'Wu', 'Age' => 26, 'Phone' => '110', 'Address' => [ 'Country' => 'China', 'City' => 'Shen Zhen' ], 'E-Mail' => [ '123456@qq.com', '666666@sina.com', '8888888@qq.com', '77887788@qq.com' ] ]; $res = $collection->insert($doc);//向集合中插入一个文档 echo ' '; print_r($res);//$res['ok']=1表示插入成功二、数据查询查询单个文档：//findOne() //参数1：搜索条件 //参数2：指定返回字段，array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回，除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段 $mongo = new MongoClient('mongodb://localhost:27017'); $db = $mongo->mf; $collection = $db->friend; $one = $collection->findOne(['First Name' => 'Jet']); echo ' '; print_r($one);//返回一个数组，查不到数据则返回NULL查询多个文档：//find() //参数1：搜索条件 //参数2：指定返回字段，array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回，除非显式设置为false不返回。不设置则返回所有字段 $mongo = new MongoClient('mongodb://localhost:27017'); $db = $mongo->mf; $collection = $db->friend; $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素 echo ' '; while($doc = $cursor->getNext()) {//循环读取每个匹配的文档 print_r($doc); }使用各种条件操作符定义查询：//mongodb分别使用$lt、$lte、$eq、$gte、$gt、$ne表示<、<=、=、>=、>、<>，用于整数字段查询 $mongo = new MongoClient('mongodb://localhost:27017'); $db = $mongo->mf; $collection = $db->friend; $cursor = $collection->find(['Age' => ['$gt' => 30]]); echo ' '; while($doc = $cursor->getNext()) { print_r($doc); }//查询某个字段的所有不重复的值 $res = $collection->distinct('Age');//$in：匹配多个值中…

php设置跨域
type: item
date: 2018-11-16T14:59:00+08:00
description: nginx配置location / { #以下跨域设置 if ( $request_method = OPTIONS ) { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET,POST,PUT,PATCH,DELETE,OPTIONS,HEAD; add_header Access-Control-Allow-Headers Origin,X-Requested-With,Content-Type,Accept,Authorization; return 200; } #以上跨域设置 try_files $uri $uri/ /index.php?$args; }php配置header("Access-Control-Allow-Origin: *"); // 允许所有来源访问 header("Access-Control-Allow-Methods: GET, POST,PUT,DELETE,HEAD,OPTIONS,TRACE,CONNECT"); // 允许访问的方式 header("Access-Control-Allow-Headers: Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With");// 允许自定义的头部参数HTTP/1.1协议中共定义了八种方法（有时也叫“动作”）来表明Request-URI指定的资源的不同操作方式：OPTIONS返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。HEAD向服务器索要与GET请求相一致的响应，只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下，就可以获取包含在响应消息头中的元信息。GET向特定的资源发出请求。注意：GET方法不应当被用于产生“副作用”的操作中。POST向指定资源提交数据进行处理请求（例如提交表单或者上传文件）。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。PUT向指定资源位置上传其最新内容。DELETE请求服务器删除Request-URI所标识的资源。TRACE回显服务器收到的请求，主要用于测试或诊断。CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。