Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP防止代码在高并发性下同时运行两次_Php - Fatal编程技术网

PHP防止代码在高并发性下同时运行两次

PHP防止代码在高并发性下同时运行两次,php,Php,第一种方法,通过浏览器只需一个脚本(非常完美) 调用另一个脚本的shell\u exec的第二个方法(不起作用) 似乎在第二种方法中,进程不关心我的锁。 为什么会这样? 还有其他选择吗 谢谢这听起来可能是个X-Y问题。为什么要阻止这种情况发生?你想解决什么问题?@ADyson锁文件的常见用法是x-y问题?基本上,当客户端请求我的脚本时,我有shell_exec方法,由于许多原因,我无法删除它。它在后台做复杂的事情需要时间。但我只能叫它一次。我使用了第一种方法,但第二种方法也需要它。@George

第一种方法,通过浏览器只需一个脚本(非常完美)

调用另一个脚本的shell\u exec的第二个方法(不起作用)

似乎在第二种方法中,进程不关心我的锁。 为什么会这样? 还有其他选择吗


谢谢

这听起来可能是个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 );