PHP防止代码在高并发性下同时运行两次
第一种方法,通过浏览器只需一个脚本(非常完美) 调用另一个脚本的shell\u exec的第二个方法(不起作用) 似乎在第二种方法中,进程不关心我的锁。 为什么会这样? 还有其他选择吗PHP防止代码在高并发性下同时运行两次,php,Php,第一种方法,通过浏览器只需一个脚本(非常完美) 调用另一个脚本的shell\u exec的第二个方法(不起作用) 似乎在第二种方法中,进程不关心我的锁。 为什么会这样? 还有其他选择吗 谢谢这听起来可能是个X-Y问题。为什么要阻止这种情况发生?你想解决什么问题?@ADyson锁文件的常见用法是x-y问题?基本上,当客户端请求我的脚本时,我有shell_exec方法,由于许多原因,我无法删除它。它在后台做复杂的事情需要时间。但我只能叫它一次。我使用了第一种方法,但第二种方法也需要它。@George
谢谢这听起来可能是个X-Y问题。为什么要阻止这种情况发生?你想解决什么问题?@ADyson锁文件的常见用法是x-y问题?基本上,当客户端请求我的脚本时,我有shell_exec方法,由于许多原因,我无法删除它。它在后台做复杂的事情需要时间。但我只能叫它一次。我使用了第一种方法,但第二种方法也需要它。@GeorgeAppleton必须像这样手动管理并发性不是很常见的要求。我认为这是一个很好的解决办法,可以掩盖一些潜在的问题。@Ohgod为什么我会说,如果test.php脚本中发生了一些长时间运行的任务,那么test.php本身应该能够检查(当它第一次启动时)该任务当前是否已经在进行中,如果是的话,它不应该再开始那个任务了。然后,您不必担心脚本本身是否被重复调用,因为它管理自己的工作负载。显然,如何实现这一点取决于此任务的实际内容。
$monitor_pid = "/tmp/a.lock";
$fp = fopen( $monitor_pid, 'a+' );
if ( flock( $fp, LOCK_EX | LOCK_NB ) )
{
$pid = intval( trim( fgets( $fp ) ) );
//RUN CODE ONCE AT A TIME
fflush( $fp );
flock( $fp, LOCK_UN );
}
else
{
exit;
}
fclose( $fp );
<?php
shell_exec("php test.php");
?>
$monitor_pid = "/tmp/a.lock";
$fp = fopen( $monitor_pid, 'a+' );
if ( flock( $fp, LOCK_EX | LOCK_NB ) )
{
$pid = intval( trim( fgets( $fp ) ) );
//RUN CODE ONCE AT A TIME
fflush( $fp );
flock( $fp, LOCK_UN );
}
else
{
exit;
}
fclose( $fp );