本来也知道其工作原理,但是php仅支持命名管道,且windows下不支持命名管道。RoadRunner官方说默认就是管道,我想看看windows下如何实现,于是看了下源码。
执行流程如下:
(1).启动go进程,go创建http-server,同时go调用php ./xxx.php 开启多个php命令行进程
(2).当go进程接收到http消息,通过标准输入传递给php命令行进程
(3).php读取进程的标准输入数据,php返回的数据写入到标准输出
(4).go进程读取到php进程的标准输出响应客户端
当然roadRunner也支持TCP_SOCKET、UNIX_SOCKET通信方式交互php
php-worker进程伪代码,php进程阻塞获取信息。
<?php
$count = 0;
while (true) {
$httpMessage = fread(STDIN, 1024);
if ($httpMessage) {
$count++;
fwrite(STDOUT, '茹您所愿,这是您访问本站的第' . $count . '次' . PHP_EOL);
}
}这里我不太清楚从专业术语来讲标准输入输出是否算管道,但是和命名管道功能差不多。而且也不清楚这种方式的性能如何。而nginx和fpm是通过TCP_SOCKET、UNIX_SOCKET,没有通过这种方式通信。
如果想在windows中执行php,并且让php脚本在后台运行,可以用下面的cmd命令start /b php D:\wwwroot\default\demo1\run.php例如上面的命令意思后台运行run.php,如果想用php编写异步代码: ...
Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者(publisher),订阅者(subscriber)和频道(channel)。 发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个...
(1).学习的目标:学会创建父子进程,并且能够区分当前进程是父还是子;了解父进程执行过程,子进程执行过程;能够用多进程执行任务(2).相关函数学习: (2.1)pcntl_fork()执行时: &nbs...
<?php /** * daemonize让当前脚本为守护进程执行 * @param string $callback 匿名函数 */ function daemonize($callback) {...
最近在编写windows php多线程的东西,从官网下载了PHP的线程安全版,尝试开启curl扩展extension=php_curl.dllphp -m 却提示 PHP Startup: Unable to load dynamic library 'C:\php\ext\php_curl...
在项目下的composer配置文件修改(PaySdk是我这里一个支付sdk的目录,包含各种各样的支付sdk,这样写的意思让composer自动把PaySdk下的所有文件自动加载):"autoload": { &...