PHP异步执行

时间:2011-05-07 09:05:19

标签: php http asynchronous

情景如下:

调用包含已知Id的{​​{1}}的指定网址,应在数据库中创建新的SearchDefinition记录并返回新的Search

在返回Search.Id之前,我需要生成一个新进程/启动异步执行PHP文件,该文件接收新的Id并进行搜索。

UI然后轮询第三个PHP脚本以获取搜索状态(第二个脚本不断更新Db中的搜索记录)。

这给我带来了一个以异步方式生成第二个PHP脚本的问题。

我将在第三方服务器上运行它,因此几乎无法控制权限。因此,我宁愿避免新的搜索记录的cron作业/类似的轮询(如果我能避免它,我真的不喜欢轮询)。我不是非常喜欢使用Web服务器进行与Web无关的工作,但为了避免可能需要的权限问题。

这似乎给我留下了两个选择:

  • 调用第一个脚本返回Id并关闭连接但继续执行并实际执行搜索(即在脚本1的末尾粘贴脚本2但在追加点处关闭响应)
  • 以异步方式启动第二个PHP脚本。

我不确定如何完成上述任何一项。第一个仍然感觉很讨厌。

如果有必要使用CURL或类似的假网络电话,我会这样做,但我希望有一种方便的多线程方法,我只是产生一个新的线程并指向适当的函数和权限将从调用者(即Web服务器用户)继承。

2 个答案:

答案 0 :(得分:7)

我宁愿使用选项1.这也会使相关功能彼此更加接近。 这是一个提示如何向用户发送内容然后关闭连接并继续执行:

(来自tom ********* at gmail dot com,来源:http://www.php.net/manual/en/features.connection-handling.php#93441

<?php
ob_end_clean();
header("Connection: close\r\n");
header("Content-Encoding: none\r\n");
ignore_user_abort(true); // optional
ob_start();
echo ('Text user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();     // Strange behaviour, will not work
flush();            // Unless both are called !
ob_end_clean();

//do processing here
sleep(5);

echo('Text user will never see');
//do some processing
?>

答案 1 :(得分:0)

swoole:异步&amp;并发扩展。 https://github.com/matyhtf/swoole

  • 事件驱动
  • 完全异步非阻塞
  • 多线程反应堆
  • 多进程工作者
  • 毫秒计时器
  • async MySQL
  • 异步任务
  • 异步读/写文件系统
  • async dns lookup