我正在为我的公司做一个项目。从本质上讲,我们将有一个长时间运行的进程,它将在python服务器上命中API以发送和接收JSON响应。它将从这些API调用中获取数据并更新mysql数据库中的表。它会响应,但也会执行计划任务。
代码已编写且功能正常。问题是,你如何智能地执行这个?在保持记忆的同时。
很像this question我现在,非常遗憾地,尽管我有很多保留,但是在一切结束后,使用while(true)
循环无限地运行15秒。引用的问题没有很多可行的答案,并且已经将近3年了。关于如何以一种内存友好和智能的方式执行此操作的任何建议。
答案 0 :(得分:0)
如果您担心在脚本运行时泄漏内存,可以将无限循环移动到只调用脚本的包装器脚本。类似的东西:
<?php
while(1) {
exec("worker_script.php");
sleep(15);
}
答案 1 :(得分:0)
问题是,如何智能地执行此操作?在保持记忆的同时。
这种方法听起来不是很糟糕。如果您想确保没有任何内存泄漏,请确保使用本地范围分配所有对象,以确保它不会累积以导致内存不足错误。
我还建议使用像Supervisor这样的守护程序管理程序,以便在崩溃时自动重启PHP进程。
此整个方法的替代方法是每隔几分钟删除while
循环并自动启动PHP进程(通过CRON作业或类似工作),并在完成后立即退出。这样做的问题是,现在您必须担心防止两个或多个脚本并行运行。
答案 2 :(得分:0)
您可能希望避免睡眠()。它超时并且可能崩溃,因此Martin关于使用Supervisor或其他重启脚本的进程的评论。此脚本可以避免睡眠和内存使用率低。
defined("RESTART_TIMER") || define("RESTART_TIMER", 15);
$restartTime = time() + RESTART_TIMER;
for (;;) {
// Most efficient loop possible.
if (time() >= $restartTime) {
exec("yourFile.php");
$restartTime = time() + RESTART_TIMER;
}
}
如果您运行php -a
,可以通过粘贴来尝试:
defined("RESTART_TIMER") || define("RESTART_TIMER", 1);
$restartTime = time() + RESTART_TIMER;
for (;;) {
// Most efficient loop possible.
if (time() >= $restartTime) {
echo memory_get_usage(true) . PHP_EOL;
$restartTime = time() + RESTART_TIMER;
}
}
当你累了的时候按ctrl-c退出它,但内存使用量是不变的。