【问题标题】:php pthreads won't launch on xampp 7.0.2php pthreads 不会在 xampp 7.0.2 上启动
【发布时间】:2016-01-31 10:14:26
【问题描述】:

我安装了新的 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) 我在这里做错了什么?谢谢!

【问题讨论】:

    标签: php xampp pthreads


    【解决方案1】:

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

    这可能是由两件事引起的,由于某些软件的设计方式,有目的地使用的线程多于一个进程可以同时处理的线程数,或者更有害的是,由于线程连接不够优雅。

    如果您似乎只是有时会遇到此类错误,则表明后者正在发生;请务必清理(显式连接)已完成的线程以使行为可预测。

    【讨论】:

    • 这很奇怪,因为我尝试从官方网站下载干净的 php 7 并且效果很好。也许我需要调整一些 php-cli.ini 变量?
    • 我刚刚检查过了——当我尝试运行脚本时,干净的 php7x86 总是给我同样的错误,而另一方面,x64 php7 版本运行脚本正常。
    • 我发现了问题,我认为 - run() 方法使用 curl 获取网络数据,当我评论这一行时,异常已经消失。所以卷曲是问题所在。但为什么?我应该创建一个新问题并在其中添加一些代码吗?
    • 是的,新问题,我愿意。
    • 好的,谢谢!这是:stackoverflow.com/questions/35113527/…
    【解决方案2】:

    我的 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 分配更多内存。

    【讨论】:

    • 虽然这是一个很好的解决方法,但它并不能真正解决或解决任何问题。此外,由于原始帖子没有提及任何限制,因此他们似乎无法启动 any 线程,这意味着您的答案可能不相关
    • @Sjon,我认为发生此错误是因为资源不足。在我的情况下,它只能创建 20 个线程,所以如果我创建超过 20 个线程,就会出现该错误。因此,我只创建了 20 个线程。如果我有超过 20 个线程,那么我循环直到一个线程完成,然后我开始新线程。在我的情况下,不会发生错误。这是我的理想,但也许我的代码性能不佳^^
    猜你喜欢
    • 2020-06-17
    • 2013-05-05
    • 2016-05-30
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2011-12-17
    相关资源
    最近更新 更多