2009-12-08 56 views
3

我有兴趣在web请求之后启动进程,或者可能在初始线程完成后分叉新进程。在网络请求后运行后台进程

我不希望使用cron,因为我将运行的工作的性质以及需要运行的频率,等待一分钟刷新不是一个选项。

我考虑这样做的几种方法:)中调用JavaScript的网页揭开序幕的过程,并立即返回

1,那么之后运行任务,例如AJAX('/ run_jobs.php?工作= 123')....你有想法

2)线程完成后分叉新线程;即output_page();新线程(); run_job(123);出口();

任何人对这个主题有任何想法或有这方面的经验。

回答

4

那么这取决于你想要运行的工作。一个更复杂但更具可扩展性和可控性的方法是使用Gearman来启动和控制作业。好的是你可以将作业分发到其他盒子,这样你的Web服务器就不会满负荷。

的简单的方法是使用exec和nohup

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

最重要的部分有脱离从PHP过程中的输出通道。为了读取进程的结果,你可以将它存储在数据库中。

+0

我选择这个作为回答,因为它涵盖了这两种情形。有时你只需要一个非常简单的东西在一个较小的网站,没有挂断执行处理这个。 – Eduardo 2016-06-03 11:07:21

3

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

Zend Queue是PHP的流行选择。

至于你提出的解决方案,你不能肯定的是,一个Ajax请求将完成(HTTP不进行关于成功或请求失败担保),所以如果你是在工作中依靠运行。我已经看到了这样的工作,但它不是最好的选择。在请求结束时分叉进程将成为性能噩梦。

1

我还没有测试过,但这里有一个想法。

使用curl异步地向newprocess.php发送请求(或者您的新进程脚本所在的位置)。您可以查看函数curl_post_async,在How do I make an asynchronous GET request in PHP?处了解如何进行此类请求。

您可能需要做一些验证,以确保只有你能火过newprocess.php ...