سؤال

متعلق ب هذا السؤال

يعمل البرنامج النصي الخاص بي بشكل جيد بشكل جيد ولكن في بعض الأحيان يتوقف عن الاستجابة في مكالمة وظيفة FREAD ولا يمكنني العثور على سبب الفشل.

private function run_lengthy_job($command, $message) {
    for($handle = popen($command, 'r'); !feof($handle); sleep(2)) {
        printf("[%s]\t%s\n", time(), $message);

        // log the operation
        exec(sprintf('logger "%s"', 
            escapeshellarg(fread($handle, 1024))));
    }

    pclose($handle);
}

مثال الأمر

hg clone -v --debug http://some.repository.com/hgwebdir.cgi/some_repo some_repo

في الوقت الحالي، فهو فشل أثناء استنساخ مستودع كبير. استمرت نفس المشكلة حتى لو قمت بتغيير FREED إلى FGETS.

معلومات موجزة عن بيئة PHP الخاصة بي،

PHP 5.2.4-2ubuntu5.6 with Suhosin-Patch 0.9.6.2 (cli) (built: Apr 17 2009 14:29:38) 
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
    with Xdebug v2.0.3, Copyright (c) 2002-2007, by Derick Rethans

يعمل على Ubuntu 8.04.2

تحرير: حاول proc_open بدلا من popen والنصية عالقة في نفس المكان. تحرير: استبدال READ READ مع Stream_Get_Contents، ولكن لا يزال عالقا في نفس المكان ...

هل كانت مفيدة؟

المحلول

حل بلدي الحالي

private function run_lengthy_job($command, $message) {
    printf("%s\t", $message);

    for($handle = popen($command, 'r'),
        stream_set_blocking($handle, FALSE),
        stream_set_timeout($handle, 3); 
        !feof($handle); sleep(1)) {

        echo '.';

        exec(sprintf('logger "%s"', 
            escapeshellarg(stream_get_contents($handle))));
    }

    $exit_status = pclose($handle);

    if(pcntl_wifexited($exit_status) 
        && pcntl_wexitstatus($exit_status) == 0) {
        echo "done!\n";
    } else {
        echo "failed!\n";
    }
}

حدث وقت الانتظار الطويل أثناء الاتصال من الأرجح لأن الوصول إلى مقبض $ يتم حظره للبوباء لكتابة الإخراج فيه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top