我想在后台运行一个 php 脚本并将其 PID 存储在数据库中。这样我就可以检查特定脚本是否正在运行(稍后)。
我们可以getmypid用来获取当前的PID。
但根据 PHP 手册
进程 ID 不是唯一的,因此它们是弱熵源。我们建议不要在依赖安全的上下文中依赖 pid。
...而且我不能依赖 PID。
我的第二个想法是将进程创建时间存储到数据库中。
如何获取当前脚本的创建时间?稍后我如何与任务列表进行比较以检查特定脚本是否正在运行?
我在共享主机、windows/linux 环境中运行。
我想在后台运行一个 php 脚本并将其 PID 存储在数据库中。这样我就可以检查特定脚本是否正在运行(稍后)。
我们可以getmypid用来获取当前的PID。
但根据 PHP 手册
进程 ID 不是唯一的,因此它们是弱熵源。我们建议不要在依赖安全的上下文中依赖 pid。
...而且我不能依赖 PID。
我的第二个想法是将进程创建时间存储到数据库中。
如何获取当前脚本的创建时间?稍后我如何与任务列表进行比较以检查特定脚本是否正在运行?
我在共享主机、windows/linux 环境中运行。
几乎没有修改以禁用非 cli 访问。
脚本可以使用/usr/bin/php script.php.
另外用于在后台nohup /usr/bin/php script.php > nohup.out &启动nohup进程。
#!/usr/bin/php
<?php
if ( PHP_SAPI !== 'cli' ) {
die( "Cmd line access only!\n" );
}
define( 'LOCK_FILE', "/var/run/".basename( $argv[0], ".php" ).".lock" ); // can also use /tmp
if( isLocked() ) die( "Already running.\n" );
# The rest of your script goes here....
echo "Hello world!\n";
sleep(30);
unlink( LOCK_FILE );
exit(0);
function isLocked()
{
# If lock file exists, check if stale. If exists and is not stale, return TRUE
# Else, create lock file and return FALSE.
if( file_exists( LOCK_FILE ) )
{
# check if it's stale
$lockingPID = trim( file_get_contents( LOCK_FILE ) );
# Get all active PIDs.
$pids = explode( "\n", trim( `ps -e | awk '{print $1}'` ) );
# If PID is still active, return true
if( in_array( $lockingPID, $pids ) ) return true;
# Lock-file is stale, so kill it. Then move on to re-creating it.
echo "Removing stale lock file.\n";
unlink( LOCK_FILE );
}
file_put_contents( LOCK_FILE, getmypid() . "\n" );
return false;
}
?>
这完全取决于您对目标机器的访问级别。您可以使用 PHP CLI,存储 PID(它们在特定时间点是唯一的,因此您不会有 2 个具有相同 PID 的进程在运行)并在输出中使用 grepps -ax来检查它们是否正在运行。如果不是 - 从数据库中删除它们,这样您就不会遇到相同 PID 的问题。
您可以尝试将 PID 与另一个 id 一起使用,例如:
如果您有一个使用文件 id = 327 的压缩作业,请尝试存储 {PID}327,并检查此特定作业是否仍在运行。
即使 PID 被重用,您也不会存储 id 为 327 的 PID,或者如果您使用这个特定的 id 327 重新启动压缩过程,PID 可能会更改。
但是,为了避免使用 id 327 获得相同的 PID,您必须先检查您的数据库,然后在组合 id 的末尾添加一个计数器,例如 {PID}327_1。
希望这可以帮到你。