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ı?
İş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.
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.