【发布时间】:2016-08-28 03:18:45
【问题描述】:
我在Ubuntu 14.04 服务器上有以下PHP 5.6.19 代码。这段代码只是连接到MySQL 5.6.28 数据库,等待一分钟,启动另一个自己的进程,然后退出。
注意:这是完整的脚本,它的目的是演示问题 - 它没有做任何有用的事情。
class DatabaseConnector {
const DB_HOST = 'localhost';
const DB_NAME = 'database1';
const DB_USERNAME = 'root';
const DB_PASSWORD = 'password';
public static $db;
public static function Init() {
if (DatabaseConnector::$db === null) {
DatabaseConnector::$db = new PDO('mysql:host=' . DatabaseConnector::DB_HOST . ';dbname=' . DatabaseConnector::DB_NAME . ';charset=utf8', DatabaseConnector::DB_USERNAME, DatabaseConnector::DB_PASSWORD);
}
}
}
$startTime = time();
// ***** Script works fine if this line is removed.
DatabaseConnector::Init();
while (true) {
// Sleep for 100 ms.
usleep(100000);
if (time() - $startTime > 60) {
$filePath = __FILE__;
$cmd = "nohup php $filePath > /tmp/1.log 2>&1 &";
// ***** Script sometimes exits here without opening the process and without errors.
$p = popen($cmd, 'r');
pclose($p);
exit;
}
}
我使用nohup php myscript.php > /tmp/1.log 2>&1 & 启动脚本的第一个进程。
这个进程循环应该永远持续下去,但是……基于多次测试,在一天之内(但不是立即),服务器上的进程会无缘无故地“消失”。我发现MySQL 代码导致popen 代码失败(脚本退出时没有任何错误或输出)。
这里发生了什么?
注意事项
- 服务器 24/7 运行。
- 内存不是问题。
- 数据库连接正确。
- 文件路径不包含空格。
- 使用
shell_exec或exec代替popen(和pclose)时存在同样的问题。
我也知道popen 是失败的那一行,因为我通过在脚本中的某些点登录到文件进行了进一步的调试(上面未显示)。
【问题讨论】:
-
根本没有错误处理。例如,如果建立 MySQL 连接失败,程序将遇到未捕获的异常并发出呱呱声。
-
试试
exec()而不是popen() -
/tmp/1.log是否包含某些内容? -
@tumber033,使用
>>而不是>。否则,您将覆盖日志。也很有趣,你为什么要这样做,因为内存泄漏? -
如果您需要始终如一地执行此操作,为什么不选择通过 CRON 或任务队列运行它?
标签: php mysql linux ubuntu pdo