Web请求后运行后台进程

时间:2009-12-08 23:15:23

标签: php ajax multithreading cron jobs

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

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

我正在考虑以下几种方法:

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

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

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

3 个答案:

答案 0 :(得分:5)

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

简单方法是在

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

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

答案 1 :(得分:3)

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

Zend Queue是PHP的热门选择。

至于您提出的解决方案,您无法确定Ajax请求是否会完成(HTTP不能保证请求的成功或失败),因此如果您依赖在工作中运行。我看到它有点工作,但它不是最好的选择。在请求结束时分叉流程将是一场性能噩梦。

答案 2 :(得分:1)

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

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

您可能需要进行一些身份验证,以确保只有您可以启动newprocess.php ...

相关问题