首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
182 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
28
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
138
篇与
的结果
2023-08-10
php发送http put/patch/delete请求Demo
php发送http put/patch/delete请求DemoCURL请求对于PHPer是必备技能,使用curl_opt函数来发送各式各样的http请求动作,不仅限于get和post。在测试自己的restful api的时候,通过访问这个代理发送http put/patch/delete请求的php页面,完成测试。请参考下面的DEMO。<?php /** * http.php * 用来向服务器的RESTful API发起各类HTTP请求的工具函数。 * * 使用: http://localhost/http.php?action=xxx * xxx \in {get,post,put,patch,delete} * * Created by PhpStorm. * User: Lenix * Date: 2018/1/6 * Time: 下午20:22 */ class commonFunction{ public function callInterfaceCommon(string $URL, string $type, string $params, array $headers):string { $ch = curl_init($URL); $timeout = 5; if($headers!=""){ curl_setopt ($ch, CURLOPT_HTTPHEADER, $headers); }else { curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type: application/<a class="wpal-linked-keyword" href="http://json.p2hp.com/" target="_blank">json</a>')); } curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); switch ($type){ case "GET" : curl_setopt($ch, CURLOPT_HTTPGET, true);break; case "POST": curl_setopt($ch, CURLOPT_POST,true); curl_setopt($ch, CURLOPT_POSTFIELDS,$params);break; case "PUT" : curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($ch, CURLOPT_POSTFIELDS,$params);break; case "PATCH": curl_setopt($ch, CULROPT_CUSTOMREQUEST, 'PATCH'); curl_setopt($ch, CURLOPT_POSTFIELDS, $params);break; case "DELETE":curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); curl_setopt($ch, CURLOPT_POSTFIELDS,$params);break; } $file_contents = curl_exec($ch);//获得返回值 return $file_contents; curl_close($ch); } } $params="{user:\"admin\",pwd:\"admin\"}"; //$headers=array('Content-Type: text/html; charset=utf-8'); //$headers=array('accept: application/json; Content-Type:application/json-patch+json'); $headers=array('Content-Type:application/json-patch+json'); #$url=$GLOBALS["serviceUrl"]."/user"; $url='http://localhost/action.php'; $cf = new commonFunction(); $action=strtoupper($_GET['action']); echo "你指定的HTTP请求动作为".$action."<br/><hr/>"; $strResult = $cf->callInterfaceCommon($url,$action,$params,$headers); echo "执行该HTTP请求动作,得到<br/>".$strResult;
2023年08月10日
46 阅读
0 评论
0 点赞
2023-08-10
php 插入mongodb uuid类型
php 插入mongodb uuid类型 $luuid ='e4eaaaf2-d142-11e1-b3e4-080027620cdd'; //格式一定要正确 » RFC 4122. $uuid='0123456789abcdef'; $id = new \MongoDB\BSON\Binary($uuid,\MongoDB\BSON\Binary::TYPE_UUID);查mongodb的LUUID类型为以下代码: $luuid= str_replace("-","",$luuid); $id= new \MongoDB\BSON\Binary(hex2bin($luuid),\MongoDB\BSON\Binary::TYPE_OLD_UUID); $id=bin2hex($id); var_dump($id);luuid 转为uuid: $luuid=二进制字符 $id=bin2hex($luuid); $a = substr($id,6, 2).substr($id,4, 2).substr($id,2, 2).substr($id,0, 2); $b = substr($id,10, 2).substr($id,8, 2); $c = substr($id,14, 2).substr($id,12, 2); $d = substr($id,16, 16); $id = $a.$b.$c.$d; $id = substr($id,0, 8).'-'.substr($id,8, 4).'-'.substr($id,12, 4).'-'.substr($id,16, 4).'-'.substr($id,20, 12); var_dump($id);uuid与luuid互转:publicfunctionreplayLuuid($id,$type) { $id = str_replace("-","",$id); $a = substr($id,6, 2).substr($id,4, 2).substr($id,2, 2).substr($id,0, 2); $b = substr($id,10, 2).substr($id,8, 2); $c = substr($id,14, 2).substr($id,12, 2); $d = substr($id,16, 16); $id = $a.$b.$c.$d; if ($type =='to') { $id= new \MongoDB\BSON\Binary(hex2bin($id),\MongoDB\BSON\Binary::TYPE_OLD_UUID); }else{ $id = substr($id,0, 8).'-'.substr($id,8, 4).'-'.substr($id,12, 4).'-'.substr($id,16, 4).'-'.substr($id,20, 12); } return $id; }
2023年08月10日
13 阅读
0 评论
0 点赞
2023-08-10
php实现协程,真正的异步
php实现协程,真正的异步github上php的协程大部分是根据这篇文章实现的:http://nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html。它们最终的结果都是把回调变成了优雅的顺序执行的代码,但还是阻塞的,不是真正的异步。比如最热门的:https://github.com/recoilphp/recoil先安装:composer require recoil/recoil:执行:<?php //recoil.php include __DIR__ . '/vendor/autoload.php'; use Recoil\React\ReactKernel; $i = 100000; ReactKernel::start(task1()); ReactKernel::start(task2()); function task1(){ global $i; echo "wait start" . PHP_EOL; while ($i-- > 0) { yield; } echo "wait end" . PHP_EOL; }; function task2(){ echo "Hello " . PHP_EOL; yield; echo "world!" . PHP_EOL; }结果:wait start//等待若干秒wait endHelloworld!我本来是想让两个任务并行,结果两个任务变成了串行,中间等待的时间什么事情都干不了。React响应式的编程是严格禁止这种等待的,所以我就参照unity3d的协程自己写了个php版本的。上代码:<?php //Coroutine.php //依赖swoole实现的定时器,也可以用其它方法实现定时器 class Coroutine { //可以根据需要更改定时器间隔,单位ms const TICK_INTERVAL = 1; private $routineList; private $tickId = -1; public function __construct() { $this->routineList = []; } public function start(Generator $routine) { $task = new Task($routine); $this->routineList[] = $task; $this->startTick(); } public function stop(Generator $routine) { foreach ($this->routineList as $k => $task) { if($task->getRoutine() == $routine){ unset($this->routineList[$k]); } } } private function startTick() { swoole_timer_tick(self::TICK_INTERVAL, function($timerId){ $this->tickId = $timerId; $this->run(); }); } private function stopTick() { if($this->tickId >= 0) { swoole_timer_clear($this->tickId); } } private function run() { if(empty($this->routineList)){ $this->stopTick(); return; } foreach ($this->routineList as $k => $task) { $task->run(); if($task->isFinished()){ unset($this->routineList[$k]); } } } } class Task { protected $stack; protected $routine; public function __construct(Generator $routine) { $this->routine = $routine; $this->stack = new SplStack(); } /** * [run 协程调度] * @return [type] [description] */ public function run() { $routine = &$this->routine; try { if(!$routine){ return; } $value = $routine->current(); //嵌套的协程 if ($value instanceof Generator) { $this->stack->push($routine); $routine = $value; return; } //嵌套的协程返回 if(!$routine->valid() && !$this->stack->isEmpty()) { $routine = $this->stack->pop(); } $routine->next(); } catch (Exception $e) { if ($this->stack->isEmpty()) { /* throw the exception */ return; } } } /** * [isFinished 判断该task是否完成] * @return boolean [description] */ public function isFinished() { return $this->stack->isEmpty() && !$this->routine->valid(); } public function getRoutine() { return $this->routine; } }测试代码:<?php //test.php require 'Coroutine.php'; $i = 10000; $c = new Coroutine(); $c->start(task1()); $c->start(task2()); function task1(){ global $i; echo "wait start" . PHP_EOL; while ($i-- > 0) { yield; } echo "wait end" . PHP_EOL; }; function task2(){ echo "Hello " . PHP_EOL; yield; echo "world!" . PHP_EOL; }结果:wait startHelloworld!//等待几秒,但不阻塞wait end注:此文章需要验证。
2023年08月10日
10 阅读
0 评论
0 点赞
2023-08-09
PHP 使用数组模拟 队列(Queue)
异步并发的服务器里经常使用队列实现生产者消费者模型,解决并发排队问题。 PHP的SPL标准库中提供了 SplQueue 扩展内置的队列数据结构。另外 PHP的数组也提供了array_pop和array_shift可以使用数组模拟队列数据结构 。SplQueue$queue = new SplQueue; //入队 $queue->push($data); //出队 $data = $queue->shift(); //查询队列中的排队数量 $n = count($queue); Array模拟队列 $queue = array(); //入队 $queue[] = $data; //出队 $data = array_shift($queue); //查询队列中的排队数量 $n = count($queue);性能对比虽然使用Array可以实现队列,但实际上性能会非常差。在一个大并发的服务器程序上,建议使用SplQueue作为队列数据结构。100万条数据随机入队、出队,使用SplQueue仅用2312.345ms即可完成,而使用Array模拟的队列的程序根本无法完成测试,CPU一直持续在100%。降低数据条数到1万条后(100倍),也需要260ms才能完成测试。SplQueue$splq = new SplQueue; for($i = 0; $i < 1000000; $i++) { $data = "hello $i\n"; $splq->push($data); if ($i % 100 == 99 and count($splq) > 100) { $popN = rand(10, 99); for ($j = 0; $j < $popN; $j++) { $splq->shift(); } } } $popN = count($splq); for ($j = 0; $j < $popN; $j++) { $splq->pop(); } Array队列 $arrq = array(); for($i = 0; $i <1000000; $i++) { $data = "hello $i\n"; $arrq[] = $data; if ($i % 100 == 99 and count($arrq) > 100) { $popN = rand(10, 99); for ($j = 0; $j < $popN; $j++) { array_shift($arrq); } } } $popN = count($arrq); for ($j = 0; $j < $popN; $j++) { array_shift($arrq); }
2023年08月09日
13 阅读
0 评论
0 点赞
2023-08-09
php 跨域 form提交 2种方法
php 跨域 form提交 2种方法出于安全因素考虑,直接跨域访问是不允许的,下面介绍二种跨域的方法。一,通过php curlfunction curlPost($url,$params) { $postData = ''; foreach($params as $k => $v) { $postData .= $k . '='.$v.'&'; } rtrim($postData, '&'); $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); curl_setopt($ch,CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_POST, count($postData)); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); $output=curl_exec($ch); curl_close($ch); return $output; } echo curlPost("http://test.com",array('name'=>"tank"));以前很多人用curl来抓,邮箱的通讯录,不过现在已经不可以了。哈哈。二,利用jquery form,ajax提交1,下载jquery.form.js2,js代码$('#testform').submit(function() { $(this).ajaxSubmit({ type: 'post', // 提交方式 get/post dataType:"json",//数据类型 url: 'your url', // 需要提交的 url success: function(data) { // data 保存提交后返回的数据,一般为 json 数据 // 此处可对 data 作相关处理 alert('提交成功!'); } $(this).resetForm(); // 提交后重置表单 }); return false; // 阻止表单自动提交事件 });3,php代码header("Access-Control-Allow-Origin:*"); //跨域权限设置,允许所有 header("Access-Control-Allow-Origin:http://www.test.com"); //只允许test.com跨域提交数据
2023年08月09日
8 阅读
0 评论
0 点赞
1
...
20
21
22
...
28