php脚本使用系统命令并在后台运行 – 它仍会按顺序运行吗?

我有以下脚本update_pos_
databases.php(简化版)

<?php
ini_set('display_errors', 1);
set_time_limit(0);
$db_host = 'localhost';
$db_user = 'root';
$db_password = 'PASSWORD';

$databases = array('example');

$db_host = escapeshellarg($db_host);
$db_user = escapeshellarg($db_user);
$db_password = escapeshellarg($db_password);

foreach($databases as $database)
{
    echo "Running queries on $database\n***********************************\n";
    system("mysql --host=$db_host --user=$db_user --password=$db_password -v -v -v $database < ../update.sql"); 
    echo "\n\n";
}
?>

当我调用它时,我会执行以下操作:

nohup php update_pos_databases.php > results.txt 2>&1 </dev/null &

由于我在php脚本中使用system命令是否有任何问题,如果使用上述命令导致其中一个系统命令由于某种原因失败?我觉得我在做的很好;但在我部署此更改之前,我想知道在使用nohup调用的脚本中使用system()的任何危险. (我不希望脚本因某些随机原因而死).

上面脚本中的单个系统命令也会被阻塞吗?我想确保它们一个接一个地运行,而不是同时运行.

最佳答案 即使终端断开(例如,注销)和&将把这个过程放在后台.是的,每个系统都会在迭代到下一个循环之前运行完成:php不知道它正在运行no-hupped.

以下是显示这些行为的简化示例:

$cat demo.php
<?php foreach (range(1,10) as $i) system("/bin/date && /bin/sleep $i");

# run it without nohup, then simulate a logout
$php demo.php > results.txt 2>&1 </dev/null &
$kill -HUP $!
$cat results.txt
Tue Sep  8 12:27:20 EDT 2015
Tue Sep  8 12:27:21 EDT 2015
[1]+  Hangup                  php demo.php > results.txt 2>&1 < /dev/null    

$# do it again, this time with nohup
$nohup php demo.php > results.txt 2>&1 </dev/null &
$kill -HUP $!  # no effect
$cat results.txt
Tue Sep  8 12:08:56 EDT 2015
Tue Sep  8 12:28:28 EDT 2015
Tue Sep  8 12:28:29 EDT 2015
Tue Sep  8 12:28:31 EDT 2015
Tue Sep  8 12:28:34 EDT 2015
Tue Sep  8 12:28:38 EDT 2015

因此,您的脚本似乎是按照您的预期编写的.我建议的唯一修改是在系统语句中放置MySQL命令行可执行文件的完整路径.

点赞