我在后台运行php脚本时遇到了一些麻烦。
我的管理区域有访问HTTP身份验证和邮件输出脚本,我想在后台运行。这个脚本需要很长时间才能执行,所以我希望它在后台执行。
我的想法是,当我访问“发送”页面时,它会在后台执行发送脚本,并将用户重定向到其他位置。
但是目前正在尝试使用cURL我无法进入发送脚本,因为它返回了所需的授权。
感谢任何建议,谢谢。
答案 0 :(得分:4)
答案 1 :(得分:1)
如果您在Linux上运行它,可以尝试pcntl_fork()。请注意,这种方法需要PHP安装部分的一些魔力(默认情况下cccl被禁用为cgi),甚至更加神奇,使您的脚本能够在apache进程清理中生效。请参阅PHP上的comment以帮助您入门。
因此,分离流程将如下所示:
if ($pid = pcntl_fork())
die(); // Parent
function shutdown() {
posix_kill(posix_getpid(), SIGHUP);
}
ob_end_clean(); // Discard the output buffer and close
fclose(STDIN); // Close all of the standard
fclose(STDOUT); // file descriptors as we
fclose(STDERR); // are running as a daemon.
register_shutdown_function('shutdown');
if (posix_setsid() < 0)
die(); // <- This is an error
if ($pid = pcntl_fork())
die(); // Parent
// Do your stuff here
答案 2 :(得分:1)
cURL有HTTP身份验证选项......
但要保存HTTP请求......这是我用来异步执行本地PHP的函数...
/**
* Asynchronously execute/include a PHP file. Does not record the output of the file anywhere.
* Relies on the PHP_PATH config constant.
*
* @param string $filename file to execute
* @param string $options (optional) arguments to pass to file via the command line
*/
function asyncInclude($filename, $options = '') {
exec(PHP_PATH . " -f {$filename} {$options} >> /dev/null &");
}
(其中PHP_PATH
是一个定义为define('PHP_PATH', '/opt/bin/php5')
或类似的)
它通过命令行传递参数。要在PHP中阅读它们,请参阅argv。
答案 3 :(得分:0)
您是否尝试过将auth发送给cURL?
可以像http://user:pass@www.domain.com
或类似的东西:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
$output = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
修改强>
FWIW听起来像cURL可能是错误的工具,但由于auth问题不应该打折
答案 4 :(得分:0)
我从您的问题中了解到,您有一个运行另一个PHP脚本的PHP脚本。您不需要使用CURL来代替run your PHP script asynchronously。
答案 5 :(得分:0)
版本1:
system('php your_script &');
- &amp;将在后台发送执行。
第2版:
不要求对脚本进行身份验证,您可以使用cURL。
答案 6 :(得分:0)
一些 - 其他 - 需要考虑的事情......我们按照你所描述的方式进行大量邮寄,至少每周10k,每天20k的爆发。我们在Cron上运行(经常通过系统启动,这对于我们的应用程序来说是光滑的)如果你没有在你的脚本上放置某种限制,它最终会超时,你的邮件工作将无法重启,中途的某个地方。我们超时并在一定数量后重新启动,通过将进度写入数据库来跟踪。由于邮件的频率和未知的操作长度,我们还使用锁文件来防止并发邮件发送。
如果您的电子邮件将接近15K /批量,我建议您查看托管的SMTP解决方案:http://smtp.com或http://www.socketlabs.com/通过您的服务器排队并通过SMTP中继发送以确保可靠的传送。
无论您发送多少封电子邮件,都不要忘记遵守CAN-Spam!