Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading - Fatal编程技术网

Php 执行锁文件(用于关键截面)清理的正确方法是什么

Php 执行锁文件(用于关键截面)清理的正确方法是什么,php,multithreading,Php,Multithreading,通过提及和 我生成以下代码。我的意图是在任何给定时间内只允许单线程/单进程运行关键部分代码 <?php // Exclusive locking based on function parameters. $lockFileName = '/tmp/cheok.lock'; // Create if doesn't exist. $lockFile = fopen($lockFileName, "w+"); if (!flock($lockFile, LOCK_EX)) { t

通过提及和

我生成以下代码。我的意图是在任何给定时间内只允许单线程/单进程运行关键部分代码

<?php

// Exclusive locking based on function parameters.
$lockFileName = '/tmp/cheok.lock';
// Create if doesn't exist.
$lockFile = fopen($lockFileName, "w+");

if (!flock($lockFile, LOCK_EX)) {
    throw new \RumtimeException("Fail to perform flock on $lockFileName");
}

echo "start critical section...\n";
sleep(10);
echo "end critical section.\n";

// Warning: unlink(/tmp/cheok.lock): No such file or directory in
unlink($lockFileName);
flock($lockFile, LOCK_UN);
这个问题被标记为,因此我将在使用pthreads的多线程上下文中回答这个问题

首先,介绍一下文件锁定。PHP手册没有完全解释什么是咨询锁

取自
flock

flock()仅放置建议锁;给定对文件的适当权限,进程可以忽略flock()的使用并对文件执行I/O

在一个生态系统中,人们同时对权限知之甚少,并使用cron作业执行长时间运行的脚本,这可能是造成很多痛苦的原因。。。虽然没人知道

在多线程环境(使用pthreads)中,如果您希望远离文件锁定,pthreads提供了一个用于实现互斥的非常优越的API

下面是创建多个线程并实现互斥的示例代码:

<?php
class Test extends Thread {

    public function __construct(Threaded $monitor) {
        $this->monitor = $monitor;
    }

    public function run () {
        $this->monitor->synchronized(function(){
            for ($i = 0; $i < 1000; $i++)
                printf("%s #%lu: %d\n",
                    __CLASS__, $this->getThreadId(), $i);
        });
    }

    private $monitor;
}

$threads = [];
$monitor = new Threaded();
for ($i = 0; $i < 8; $i++) {
    $threads[$i] = new Test($monitor);
    $threads[$i]->start();
}

foreach ($threads as $thread) 
    $thread->join();

我们可以看到,每个
线程
都被排除在执行传递给
Threaded::synchronized

闭包
中的代码之外。您可以使用优秀的Process Explorer任务管理器解锁文件。我们之前已经详细介绍了Process Explorer,所以这里我们将直接深入了解如何解锁文件。你不需要先安装它,它是一个可移植的应用程序,但你需要以管理权限运行它。实际上,您可以在Process Explorer中通过单击“文件”菜单并选择“显示所有进程的详细信息”来执行此操作。

为什么要删除它。把文件放在那里,如果你能锁定它,那么你可以继续关键的过程。如果没有,则其他进程处于控制状态,请等待,稍后再试。毕竟,你对它的存在不感兴趣,只是为了能得到它的独家锁。我希望有一天我会爱上它;)@这只是一个演示代码。在生产代码中,我们将根据锁定条件创建许多具有不同名称的文件。如果我们不删除该文件,我们的服务器磁盘很快就会满:)为什么,它们不包含任何数据,您感兴趣的只是存在。如果您的文件系统无法同时处理所有可能创建的文件,那么在实时处理过程中达到最大值时,此方法将导致问题
如果对文件具有适当的权限,则进程可以忽略flock()的使用并对文件执行I/O
您知道这些权限是什么吗?文档页面似乎有点模糊。(不太确定我是否希望看到更多这样的答案,否则:欢迎使用SO!)
我们已经讨论了…
你是谁<代码>优秀的Process Explorer任务管理器
什么
Process Explorer
?这是植入式广告吗?
Test #140561163798272: 0
<-- snip for brevity -->
Test #140561163798272: 999
Test #140561151424256: 0
<-- snip for brevity -->
Test #140561151424256: 999
Test #140561138841344: 0
<-- snip for brevity -->
Test #140561138841344: 999
Test #140561059149568: 0
<-- snip for brevity -->
Test #140561059149568: 999
Test #140561050756864: 0
<-- snip for brevity -->
Test #140561050756864: 999
Test #140561042364160: 0
<-- snip for brevity -->
Test #140561042364160: 999
Test #140561033971456: 0
<-- snip for brevity -->
Test #140561033971456: 999
Test #140561025578752: 0
<-- snip for brevity -->
Test #140561025578752: 999