我有兴趣在Web请求之后启动进程,或者可能在初始线程完成后分支新进程。
我不想使用cron,因为我将要运行的作业的性质以及需要运行的频率,等待一分钟刷新不是一种选择。
我正在考虑以下几种方法:
1)在javascript中调用一个页面,启动进程并立即返回,然后运行任务,例如ajax('/ run_jobs.php?job = 123')....你明白了
2)在线程完成后分叉新线程;即output_page();新线程(); run_job(123);出口();
任何人对此主题有任何想法或有相关经验。
答案 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 ...