8

我有一个 PHP 脚本,它检查一个目录并删除任何未在 15 秒内修改的文件(这是为了游戏)。

我的问题是如何让这个脚本一直运行。我设置了一个 cron 作业以每 10 分钟运行一次,然后在 PHP 脚本中我有一个无限循环和 sleep(10)。我的想法是它会每 10 秒运行一次代码,并且在脚本停止的情况下,cron 作业最终会重新启动它。

但是,脚本启动后,它会运行大约 3 个循环(30 秒)然后停止。我听说 PHP 每次文件加载只能获得这么多的内存。

如何让这个 PHP 脚本无限循环?也许有某种方式可以称自己为

4

6 回答 6

5

您可以运行一个父 php 进程,该进程每隔一段时间分叉一个客户端。如果您对探索它作为一个选项感到好奇,这里是一个很好的起点:http : //ca2.php.net/pcntl 这样做的好处是父进程可以杀死不在内部结束的客户端 pid合理的时间。

如果您正在寻找快速而肮脏的东西,您可以编写一个 bash 脚本来很容易地调用 php(如果您在 linux 上):

#!/bin/bash
while [ "true" ]; do
        /path/to/script.php
        sleep 15
done

编辑 您甚至不需要脚本,bash 将在一行中完成所有操作:

while [ "true" ]; do /path/to/script.php; sleep 15; done
于 2009-07-13T21:20:00.893 回答
2

您可能需要检查 php.ini 文件中的 max_execution_time 参数。我相信默认值为 30 秒。使用 cron 设置它的方式,您可能会在 10 分钟后运行脚本的多个实例,除非您在脚本中添加一些逻辑以检查其自身的实例是否尚未运行

于 2009-07-13T20:49:47.600 回答
2

确保您的 PHP 可执行文件被编译为用作命令行解释器,而不是 CGI 可执行文件。PHP 通常会杀死运行时间超过max_execution_time(默认为 30 秒)的脚本。但是,CLI 可执行文件不施加此限制。

有关 CLI 与 CGI SAPI 的更多信息。

您可以使用以下--version参数检查可执行文件的 SAPI:

$ php --version
PHP 4.3.0 (cli), Copyright (c) 1997-2002 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2002 Zend Technologies
于 2009-07-13T20:50:44.650 回答
1

PHP 作为一门语言并不擅长无限期地运行。既然你每十分钟就有一个 cron-job,为什么不执行你的任务 60 次然后退出呢?

此外,PHP 在大多数 linux 服务器上为 CLI 和 apache 模式提供了不同的配置文件。因此,检查您的 etc/php/cli/php.ini 并检查最大执行时间和内存限制可能是明智的。

于 2009-07-13T20:49:49.410 回答
0

每隔一段时间(在内存不足之前)跳出循环并重新执行自身 exec("/usr/bin/php " . FILE );

于 2009-07-13T20:53:11.587 回答
0

有一个用于编写长时间运行的 PHP 脚本的PEAR 模块。我自己虽然没用过。

于 2009-07-13T21:57:32.220 回答