php pthreads不会在xampp 7.0.2上启动

时间:2016-01-31 10:14:26

标签: php xampp pthreads

我安装了新的xampp(7.0.2 atm)。我已经创建了php-cli.ini,在那里添加了pthread扩展并将内存限制设置为3 GB。但当我试图启动线程脚本时,我得到了这个:

PHP Fatal error:  Uncaught RuntimeException: cannot start my_thread, out of reso
urces in C:\xampp\htdocs\w\start_threads.php:160
Stack trace:
#0 C:\xampp\htdocs\w\start_threads.php(160): Thread->start()
#1 {main}
  thrown in C:\xampp\htdocs\w\start_threads.php on line 160

Fatal error: Uncaught RuntimeException: cannot start my_thread, out of resources
 in C:\xampp\htdocs\w\start_threads.php:160

(我使用的是pthreds 3.1.5 x86) 我在这做错了什么?谢谢!

2 个答案:

答案 0 :(得分:2)

本质上,这是由pthread_create返回EAGAIN引起的:这意味着系统缺少创建另一个线程的资源,或者系统对最大线程数施加限制(在进程中,或已达到系统范围。

这可能是由两件事造成的,因为一些软件的设计方式,有目的地使用更多的线程而不是一个进程可以同时处理,或者由于线程加入不够优雅而导致更有害。 / p>

如果你有时似乎只遇到这样的错误,那么就会暗示后者正在发生;确保清理(显式连接)您完成的线程以使行为可预测。

答案 1 :(得分:-1)

我的PHP版本:7.2.6 x82 和pthreads:php_pthreads-3.1.6-7.2-ts-vc15-x86 我创建了25个线程,当创建第21个线程然后发生相同的错误。 我认为它只能创建20个线程。 所以我编辑了我的代码并且没有发生错误 我的代码:

class ReadAllFile extends Thread {

    public $folder;

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

    public function run() {
        //code process
    }

}

$dir = "F:/sbd/sbdstore/20180606/";
$subFolders = scandir ( $dir );

$stack = array();

foreach ( $subFolders as $folder ) {

    if ($folder != '.' && $folder != '..') {

        $stack[] = new ReadAllFile ( $dir.$folder );
    }


}

$maxNumberOfThread = 20;
$numberOfRunning = 0;
$numberOfStack = count($stack);
$elementIsStarted = array();
$allElementIsProcess = false;

while(count($stack)){

    if($numberOfRunning <= $maxNumberOfThread && !$allElementIsProcess){

        for($i=0;$i<$numberOfStack;$i++){

            if(!in_array($i,$elementIsStarted)){

                $numberOfRunning++;
                $elementIsStarted[] = $i;
                $stack[$i]->start();

                if($i == $numberOfStack - 1){

                    $allElementIsProcess = true;

                }

                $i = $numberOfStack + 1;

            }

        }

    }else{

        foreach($elementIsStarted AS $element){

            if(isset($stack[$element]) && $stack[$element]->isRunning() !== true){

                unset($stack[$element]);
                $numberOfRunning--;

            }

        }

    }

} 

希望这有帮助。 抱歉我的英文。

P / s:如果我使用PHP版本:7.2.6 x64和php_pthreads-3.1.6-7.2-ts-vc15-x64那么它不会发生此错误。 我认为x64配置的内存更多。