Bir PHP komut dosyası başka bir PHP komut dosyası ve çıkış başlayabilir miyim?

6 Cevap php

Nasıl bir PHP komut dosyası başka bir PHP komut dosyasını başlatmak ve ardından çıkmak, diğer komut çalışan bırakarak olabilir?

Ayrıca, belirli bir çizgi ulaştığında PHP komut bilgilendirmek için 2 komut dosyası için herhangi bir yolu var mı?

6 Cevap

İşte bunu yapmak için nasıl. Bitti kadar çalıştırmaya devam ederken, çıkış ilk N karakterleri okumak ve ardından bağlantıyı kapatmak için tarayıcı söyler.

<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(); // optional
ob_start();
echo ('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();     // Will not work
flush();            // Unless both are called !

// At this point, the browser has closed connection to the web server

// Do processing here
include('other_script.php');

echo('Text user will never see');
?>

Etkili forking bunu başarmak ve daha sonra include veya require çağrı yapabilirsiniz.

parent.php:

<?php

    $pid = pcntl_fork();
    if ($pid == -1) {
        die("couldn't fork");
    } else if ($pid) { // parent script
        echo "Parent waiting at " . date("H:i:s") . "\n";
        pcntl_wait($status);
        echo "Parent done at " . date("H:i:s") . "\n";
    } else {
        // child script
        echo "Sleeper started at " . date("H:i:s") . "\n";
        include('sleeper.php');
        echo "Sleeper done at " . date("H:i:s") . "\n";
    }

?>

sleeper.php:

<?php
sleep(3);
?>

Çıktı:

$ php parent.php
Sleeper started at 01:22:02
Parent waiting at 01:22:02
Sleeper done at 01:22:05
Parent done at 01:22:05

Ancak, çatallaşma doğal, herhangi bir inter-işlem iletişim izin vermiyor, bu yüzden size soru sordu gibi çocuk, belirli bir çizgi ulaşmıştır ebeveyne bildirmek için başka bir yol bulmak lazım.

İşte karanlık bir çekim: Eğer & ile php OS yürütme fonksiyonlarını kullanarak deneyebilirsiniz.

exec("./somescript.php &");

Bu işe yaramazsa, ayrıca, deneyebilirsin

exec("nohup ./somescript.php &");

Edit: nohup is a POSIX command to ignore the HUP (hangup) signal, enabling the command to keep running after the user who issues the command has logged out. The HUP (hangup) signal is by convention the way a terminal warns depending processes of logout.

pcntl_fork() sonuçta gerçekleştirmek için çalışıyoruz ne benzer bir şey yapar mısın? http://www.php.net/manual/en/function.pcntl-fork.php

Eğer PCNTL eklentisini kurmak istemiyorsanız, o zaman iyi bir alternatif () proc_open kullanmaktır.

http://www.php.net/manual/en/function.proc-open.php

Birlikte stream_select () ile böylece PHP süreç bir şey çıkana kadar uyuyabilir kullanın oluşturduğunuz çocuk süreç ile olur.

Bu etkili ebeveyn PHP sürecini engelleme olmadan, arka planda bir süreç yaratacaktır. PHP okumak ve stdin, stdout, STDERR yazabilirsiniz.

Tarayıcı tam yükleme (yük ilerleme göstergesini) yapmak için o zaman Milan Babuskov sözü ne kullanabilirsiniz.

Tarayıcı yapmak için anahtar HTTP isteği, tamamlandığında o içerik uzunluğunu göndermek olduğunu düşünüyorum. Eğer Content-Length üstbilgisi gönderdikten sonra Bunu yapmak için isteği tampon başlayabilir, daha sonra yıkayın.

örneğin:

<?php

ob_start();

// render the HTML page and/or process stuff

header('Content-Length: '.ob_get_length());
ob_flush();
flush();

// can do more processing

?>

Bir isteği oluşturmak ve yazılıyor yapılır hemen sonra bağlantıyı kapatabilirsiniz.

Bu (non-engelleme isteği) yapabileceğiniz gibi http://drupal.org/project/httprl kodunu Ödeme. Ben daha cilalı bir kez github bu lib itme planı; Drupal dışında koştu olabilir bir şey. Bu seyir için ne yapmalıyım.