gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 23:30:20 26 4
gpt4 key购买 nike

我有以下脚本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 脚本中使用了系统命令,如果其中一个系统命令因某种原因失败,使用上述命令时是否会出现任何问题?我觉得我做的很好;但在部署此更改之前,我想知道在使用 nohup 调用的脚本中使用 system() 的任何危险。 (我不希望脚本因某些随机原因而死掉)。

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

最佳答案

nohupkeep the process going即使终端断开连接(例如注销),& 也会将该进程置于后台。是的,每个 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 命令行可执行文件的完整路径放在系统语句中。

关于使用系统命令并在后台运行的 php 脚本——它仍会按顺序运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29721188/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com