PHP Uzun Süreçleri terk (Ama onları tamamlamak izin)

6 Cevap php

Ben bir komut dosyasını başlatır, bir PHP sayfası gönderen bir HTML formu var. Komut dosyası çalıştırmak için 30 saniye 3 saniye sürebilir - kullanıcı tamamlamak için bu komut için civarında olması gerekmez.

, Derhal kullanıcı (ya da her neyse) "Teşekkür" yazdırmak ve komut çalışmaya devam ederken onların neşeli yolda gidelim bir PHP komut dosyası başlatmak mümkün mü?

Benim özel durumda, ben daha sonra çok sayıda başka yerlere verileri nakleder ki bir php script form-data gönderiyorum. Başarılı olmak için tüm mesajların bekliyorum şu anda benim çıkarına değildir. Ben sadece, komut dosyası çalıştırmak izin ister gitmek ve onlar gibi başka ne yapmak kullanıcı izin, ve bu kadar olur.

6 Cevap

Ben aşağıdaki ile sona erdi.

<?php

  // Ignore User-Requests to Abort
  ignore_user_abort(true);
  // Maximum Execution Time In Seconds
  set_time_limit(30);

  header("Content-Length: 0");
  flush();

  /*

    Loooooooong process

  */

?>

Örneğin, başka bir php script uzun vadeli iş yerleştirin

background.php:

sleep(10);
file_put_contents('foo.txt',mktime());

foreground.php

$unused_but_required = array();
proc_close(proc_open ("php background.php &", array(), $unused_but_required));
echo("Done);

Hemen "Bitti" ve dosya 10 saniye sonra yazılı alacak görürsünüz.

Biz hiçbir boruları proc_open veren ve hiçbir dosya tanımlayıcıları ettik çünkü proc_close eserlerini düşünüyorum.

Senaryoda size ayarlayabilirsiniz:

<?php
 ignore_user_abort(true);

Kullanıcı sayfayı çıktığında bu şekilde komut sona ermeyecektir. Bu whith birleştirerek Ancak çok dikkatli olmak

 set_time_limit(0);

O zamandan beri senaryo sonsuza yürütebilir.

Sen set_time_limit ve ignore_user_abort kullanabilirsiniz, ama genel konuşmak gerekirse, ben bir kuyrukta işi koymak öneririz ve bunu işlemek için zaman uyumsuz bir komut dosyası kullanabilirsiniz. Bu çok basit ve dayanıklı tasarım.

Denilen pcntl_fork etrafında bir API sarıcı () gidecekseniz php_fork.

Ama aynı zamanda, bu soru, Daily WTF ... bir cam şişe ile bir çivi sterlin yok oldu.