5

我有兴趣在 Web 请求后启动进程,或者可能在初始线程完成后分叉一个新进程。

我宁愿不使用 cron,因为我将运行的作业的性质以及它们需要运行的频率,等待一分钟刷新不是一种选择。

我正在考虑这样做的几种方法:

1)在 javascript 中调用一个页面,该页面启动进程并立即返回,然后在之后运行任务,例如 ajax('/run_jobs.php?job=123').... 你明白了

2) 一个线程完成后fork一个新线程;即 output_page(); 新线程(); 运行作业(123);出口();

任何人对此主题有任何想法或对此有经验。

4

3 回答 3

7

好吧,这取决于您要运行的工作。一种更复杂但更具可扩展性和可控性的方法是使用 Gearman 来启动和控制作业。好消息是您可以将作业分配到其他盒子,这样您的 Web 服务器就不会得到全部负载。

简单的方法是使用 exec 和nohuplike in

<?php
exec("nohup /usr/bin/php script.php >/dev/null 2>/dev/null &");
?>

重要的部分是将输出通道从 PHP 进程中分离出来。为了读取过程的结果,您可以将其存储在数据库中。

于 2009-12-08T23:50:05.913 回答
4

如今,处理这类事情的标准方法是消息队列系统。在您的请求结束时,您将一条消息发送到队列中。然后,有某种外部进程正在运行(例如,多个 cron),它不断地从队列中读取消息并运行需要运行的作业

Zend Queue是 PHP 的流行选择。

至于您提出的解决方案,您不能确定 Ajax 请求是否会完成(HTTP 不保证请求的成功或失败),所以如果您依赖于正在运行的作业。我已经看到它的工作,但它不是最好的选择。在请求结束时分叉一个进程将是一场性能噩梦。

于 2009-12-08T23:48:21.190 回答
1

我没有对此进行测试,但这是一个想法。

使用 curl,异步向 newprocess.php(或您的新流程脚本所在的任何位置)发送请求。您可以查看函数 curl_post_async 在如何在 PHP 中发出异步 GET 请求?关于如何提出这样的要求。

You might want to do some authentication to make sure that only you can fire off newprocess.php ...

于 2009-12-09T03:19:17.153 回答