Swoole

php中pcntl_fork详解

本秂侑毒 提交于 2019-12-07 21:44:21
pcntl_fork()函数是php-pcntl模块中用于创建进程的函数。(不支持windows) 至于php_pcntl扩展如何安装开启这里就不介绍了,只分析pcntl_fork()这个函数本身。 1.$one = 123; 2.$one++; 3.$two = time(); 4.$pid = []; 5.$pid = pcntl_fork(); 6.$three = time(); 当:pcntl_fork()函数执行的时候,会创建一个子进程。子进程会复制当前进程,也就是父进程的所有:数据,代码,还有状态。 1.当pcntl_fork()创建子进程成功后,在父进程内,返回0,在子进程内返回自身的进程号,失败则返回-1 2.子进程会复制父进程的代码,数据。那么就说明:子,父进程拥有的代码和数据会一模一样。 3.重点:子进程会复制父进程的状态,那么就有上面的示例代码:在第五行执行了pcntl_fork,那么创建出的子进程,代码也是从第五行开始执行的。又子进程复制了数据,代码。所以,在子进程内同理存在:$one,$two等变量 for ($i = 0; $i < 3; $i++) { $pid = pcntl_fork(); } sleep(30); 那么:上面的for循环,实际会产生多少个子进程?答案是7个,在linux下,用ps命令将可以看到8个进程(1个父进程,7个子进程)

linux安装openssl、swoole等扩展的具体步骤

瘦欲@ 提交于 2019-12-07 13:01:05
作者:白狼 出处: http://www.manks.top/linux-install-extension.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 编译安装 先来看编译安装的php,如果需要安装新的扩展,这里以安装openssl扩展为例进行说明 1、找到php源码目录,我们这里的源码位于 /opt/download/php-5.5.30 ,如果找不到了,查看当前php版本,通过 wget http://cn2.php.net/distributions/php-5.5.30.tar.gz 把php-5.5.30改为具体版本重新下载即可 2、切换到源码目录,找到对应的扩展包 cd /opt/download/php-5.5.30/ext/openssl 3、找到phpize所在目录(可通过whereis查找),然后执行 /usr/local/bin/phpize 4、有的可能执行后报错,提示无法找到config.m4,当前目录config0.m4就是config.m4,直接直接重命名即可(mv config0.m4 config.m4) 5、./configure --with-openssl --with-php-config= /usr/local/bin/php-config 6

【宇润日常疯测-007】Swoole 协程与传统 fpm 同步模式比较

ε祈祈猫儿з 提交于 2019-12-06 07:24:07
如果说数组是 PHP 的精髓,数组玩得不6的,根本不能算是会用PHP。那协程对于 Swoole 也是同理,不理解协程去用 Swoole,那就是在瞎用。 首先,Swoole 只能运行在命令行(Cli)模式下,所以我们开发调试都是使用命令行,而不是 php-fpm/apache 等。 在 Swoole 中,我们可以使用 \Swoole\Coroutine::create() 创建协程,或者你也可以使用简写 go() 。 初识 Swoole 协程 go(function(){ go(function(){ echo 0, PHP_EOL; }); echo 1, PHP_EOL; }); go(function(){ echo 2, PHP_EOL; }); go(function(){ echo 3, PHP_EOL; }); 执行结果: 0 1 2 3 Swoole 协程与同步模式比较 我们一直在说 Swoole 协程适合用于 I/O 密集场景,在同样的硬件配置环境下,它会比传统的同步模式承载更多的访问量。 我们熟悉的文件读写、网络通讯请求(MySQL、Redis、Http等)都是属于 I/O 密集型场景。 假设一次 SQL 查询为 100ms,在传统同步模式下,当前进程在这 100ms 的时间里,是不能做其它操作的。如果要执行十次这个 SQL,可能需要耗费 1s 以上。

PHP PDO在SWOOLE模式下关闭数据库连接一些注意点

大兔子大兔子 提交于 2019-12-05 15:37:00
最近在swoole中使用php pdo扩展访问数据库的时候,发现了一个很有意思的事情。 我测试用的版本是 PHP 7.1.13 官方手册明确到告诉我们,使用PDO是这样关闭数据库连接的,只需要将PDO对象置为null即可,这段代码就是手册里的 <?php try { $dbh = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', ''); foreach($dbh->query('SELECT * from test') as $row) { print_r($row); } sleep(100); $dbh = null; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "<br/>"; die(); } 我实际测下来也的确如此。 这是query执行前的MySQL的PROCESSLIST mysql> SHOW PROCESSLIST; +----+------+-----------------+------+---------+------+----------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------

【宇润日常疯测-005】PHP 中的 clone 和 new 性能比较

早过忘川 提交于 2019-12-05 10:51:39
clone 和 new 本不应该放在一起比较,它们的作用是不同的。但可能有一些场景下,可以用 clone 也可以用 new ,那么这时候我们选哪个呢? 我编写了两个测试,第一个是声明一个空类,第二个是带构造方法、属性的类。另外,我还加入了 PHP 序列化的测试。 国际惯例,直接上代码,一目了然。 代码 <?php define('TEST_COUNT', 10000); function test($name, $callable) { $time = microtime(true); $callable(); echo $name, ' time: ', microtime(true) - $time, 's', PHP_EOL; } // 空的类 class A { } function test1() { echo '空的类:', PHP_EOL; $a = new A; test('A clone', function() use($a){ for($i = 0; $i < TEST_COUNT; ++$i) { $obj = clone $a; } }); test('A new', function(){ for($i = 0; $i < TEST_COUNT; ++$i) { $obj = new A; } }); $serialize = serialize($a)

借助URLOS快速安装swoole环境

[亡魂溺海] 提交于 2019-12-04 15:22:37
环境需求 最低硬件配置:1核CPU,1G内存(1+1)提示:如果你的应用较多,而主机节点的硬件配置较低,建议在部署节点时开通虚拟虚拟内存; 生产环境建议使用2G或以上内存; 推荐安装系统:Ubuntu-16.04、Ubuntu-18.04、CentOS7.X、Debian9X的64位的纯净的操作系统; URLOS安装 curl -LO www.urlos.com/iu && sh iu swoole环境安装流程 登录URLOS系统后台,在应用市场中搜索“swoole”,找到之后,选择合适的版本点击安装按钮 填写服务名称、选择运行节点、服务端口、选择智能部署 填写ssh密码(这里的密码是root密码) 然后点击“提交”按钮,等待部署完成; 来源: oschina 链接: https://my.oschina.net/u/4130064/blog/3074419

【宇润日常疯测-003】PHP 序列化和 JSON 哪个更好?

六眼飞鱼酱① 提交于 2019-12-04 13:30:22
有了 Swoole 以后,用我们熟悉的 PHP 就可以很方便地开发网络通信应用。有时候我们系统内部需要交换数据,那么,这时候问题来了,网络通讯的数据格式是选择 JSON 还是 serialize 呢? 一通分析猛如虎 JSON 显然更通用,不用关心通信双方是什么语言。 serialize 也不差,它可以将对象状态保存,在反序列化时恢复状态。这是 JSON 所不能比的。但是每种语言自身的 serialize 几乎都不通用,跨语言通讯行不通。 所以,这里我们暂时只先考虑 PHP 内部系统间的数据交换,用哪个更好呢? 这个问题,没有亲自测试过的人,肯定不能拍着胸脯说出答案。因为我也看了,网上对这两种数据格式公说纷纭。 那么,我也来亲自验证一下吧。当然,结果仅供参考,请根据实际场景选择适合你们项目的数据格式。 代码验证 首先我要说明一下,我选择了几种数据结构,有数组、嵌套数组、对象、对象数组、某API大量数据,尽管挺多的,但是还是有可能考虑不全面。 首先我使用了一个公开api来获取一个大量数据,保存为 data.json 文件,api地址: https://www.apiopen.top/journalismApi 我的环境: WSL + PHP 7.2.12 然后跑下面的代码: <?php define('TEST_COUNT', 10000); function test($name,

SplPriorityQueue 序列化并反序列化后结果为空问题解决

删除回忆录丶 提交于 2019-12-04 13:29:51
今天在尝试把 SplPriorityQueue 对象序列化并反序列化后,遇到了问题。反序列化后在队列里的数据全没了,这让我很伤心。 <?php $pq = new SplPriorityQueue; $pq->insert('imi 基于 Swoole 常驻内存协程开发框架', 100); $pq->insert('https://gitee.com/yurunsoft/IMI', 200); $pq->insert('https://github.com/Yurunsoft/IMI', 300); var_dump($pq->count()); $serialize = serialize($pq); var_dump($serialize); $unserialize = unserialize($serialize); var_dump($unserialize->count()); 结果: int(3) string(28) "O:16:"SplPriorityQueue":0:{}" int(0) 莫得办法,自己动手丰衣足食吧!通过自定义类继承 SplPriorityQueue 并实现 Serializable 接口,来自己处理序列化和反序列化数据。 解决问题的代码如下: class PriorityQueue extends \SplPriorityQueue

Curl 在 Swoole 协程中的解决方案

邮差的信 提交于 2019-12-03 03:08:39
众所周知,在 Swoole 应用中,是不推荐使用 Curl 的,因为 Curl 会阻塞进程。 本文会用实际的代码和数据,用最直观的方式,让你明白为什么。 最后还会给出 Curl 在 Swoole 中的解决方案,如果不想看分析可以直接拉到最后。 例程对比 宇润看文章不喜欢那些虚的,所以自己写也比较实在,直接来跑一下代码,用数据看为什么不推荐在 Swoole 使用 Curl。 为了偷懒,我直接用了 YurunHttp 的 Curl 和 Swoole Handler,来替代那些又臭又长的 Curl 代码。 代码 composer.json { "require": { "yurunsoft/yurun-http": "~3.0" } } server.php <?php $http = new Swoole\Http\Server('127.0.0.1', 9501); $http->on('workerstart', function(){ \Swoole\Runtime::enableCoroutine(); }); $http->on('request', function ($request, $response) { sleep(1); // 假设各种处理耗时1秒 $response->end($request->get['id'] . ': ' . date('Y-m-d H

phpstorm增加swoole自动提示

↘锁芯ラ 提交于 2019-12-02 07:25:48
安装完swoole扩展后,准备敲个例子尝试一下,发现所有的swoole函数全部反白,没有代码提示,看起来很难受,搜索了一番,总算是解决掉这个问题了。 下载swoole-ide-helper-en git clone https://github.com/eaglewu/swoole-ide-helper.git 打开PHPStorm 右键External Libraries,选择Configure PHP Include Path 选择下载好的swoole-ide-helper目录,点击确定。 然后就会发现代码中swoole相关方法函数不再反白了。 PhpStorm支持CI框架的自动补全 git clone https://github.com/topdown/phpStorm-CC-Helpers 来源: oschina 链接: https://my.oschina.net/u/105637/blog/2966719