我正在尝试在 PHP 中测试竞争条件。我想让 N 个 PHP 进程准备好做某事,然后阻塞。当我说“开始”时,他们应该同时执行动作。希望这将证明比赛。
在 Java 中,我会使用 Object.wait() 和 Object.notifyAll()。我可以在 PHP 中使用什么?
(可以接受 Windows 或 linux 原生答案)
我正在尝试在 PHP 中测试竞争条件。我想让 N 个 PHP 进程准备好做某事,然后阻塞。当我说“开始”时,他们应该同时执行动作。希望这将证明比赛。
在 Java 中,我会使用 Object.wait() 和 Object.notifyAll()。我可以在 PHP 中使用什么?
(可以接受 Windows 或 linux 原生答案)
wait.txt
”wait.txt
”文件。...
<?php
while (file_exists('wait.txt')) {}
runRaceTest();
通常与 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!
PHP没有多线程。它也没有计划实施。您可以尝试使用套接字或0MQ来在多个进程之间进行通信