1

我正在尝试在 PHP 中测试竞争条件。我想让 N 个 PHP 进程准备好做某事,然后阻塞。当我说“开始”时,他们应该同时执行动作。希望这将证明比赛。

在 Java 中,我会使用 Object.wait() 和 Object.notifyAll()。我可以在 PHP 中使用什么?

(可以接受 Windows 或 linux 原生答案)

4

3 回答 3

2
  • 创建文件“ wait.txt
  • 启动N个进程,每个进程代码如下
  • 删除“ wait.txt”文件。

...

<?php
while (file_exists('wait.txt')) {}
runRaceTest();
于 2013-04-17T17:25:11.063 回答
1

通常与 PHP 文件锁定的方法一起使用。一个人创建一个RUN_LOCK或类似的文件并要求file_exists("RUN_LOCK"). 该系统还用于保护递归线程中潜在的无限循环。

我决定要求执行该文件。其他方法可能是,文件的存在调用阻塞算法。这取决于你的情况。总是更安全的情况应该更容易实现。

等待代码:

/*prepare the program*/
   /* ... */
/*Block until its time to go*/
define("LOCK_FILE", "RUN_UNLOCK");    //I'd define this in some config.php
while(!file_exists(LOCK_FILE)) {
    usleep(1); //No sleep will eat lots of CPU
}
/*Execute the main code*/
   /* ... */
/*Delete the "run" file, so that no further executions should be allowed*/
usleep(1);  //Just for sure - we want other processes to start execution phase too
if(file_exists(LOCK_FILE))
    unlink(LOCK_FILE);

我想有一个阻塞功能会很好,比如这个:

function wait_for_file($filename, $timeout = -1) {
    if($timeout>=0) {
        $start = microtime(true)*1000;    //Remember the start time
    }    
    while(!file_exists($filename)) {      //Check the file existence
        if($timeout>=0) {                 //Only calculate when timeout is set
           if((microtime(true)*1000-$start)>$timeout) //Compare current time with start time (current always will be > than start)
             return false;          //Return failure
        }   
        usleep(1);         //Save some CPU
    }
    return true;           //Return success
}

它实现了超时。你不需要它们,但也许其他人会。
用法:

header("Content-Type: text/plain; charset=utf-8"); 
ob_implicit_flush(true);while (@ob_end_clean());   //Flush buffers so the output will be live stream
define("LOCK_FILE","RUN_FOREST_RUN");  //Define lock file name again
echo "Starting the blocking algorithm. Waiting for file: ".LOCK_FILE."\n"; 
if(wait_for_file(LOCK_FILE, 10000)) {  //Wait for 10 secconds
    echo "File found and deleted!\n";
    if(file_exists(LOCK_FILE))   //May have been deleted by other proceses
        unlink(LOCK_FILE);
}
else {
    echo "Wait failed!\n";
}

这将输出:

Starting the blocking algorithm. Waiting for file: RUN_FOREST_RUN
Wait failed!

~or~

Starting the blocking algorithm. Waiting for file: RUN_FOREST_RUN
File found and deleted!
于 2013-04-17T18:05:45.177 回答
-1

PHP没有多线程。它也没有计划实施。您可以尝试使用套接字或0MQ来在多个进程之间进行通信

请参阅为什么 PHP 不支持多线程? php多线程

于 2013-04-17T14:47:40.600 回答