ignore_user_abort ve php yönlendirme?

4 Cevap php

I have a very similar setup to the person here:
http://stackoverflow.com/questions/265073/php-background-processes
i.e a very long script that takes up to 10 minutes. However, I need the person who calls the script redirected back to the homepage while the script works. In other words, I need the user experience to be something like this:

  • güncelleme butonuna tıklayın
  • komut yürütmek başlar, 10 dakika kadar sürebilir
  • kullanıcı derhal geri ana sayfasına yönlendirilir

Bu sadece PHP kullanarak mümkün mü? Ben ihtiyacım olacak toplamak

ignore_user_abort(true); 
set_time_limit(0);

Ama nasıl kullanıcıyı yönlendirmek? Çıkışı sadece uzun artışlarla sayfasına yazılı alır çünkü javascript kullanmak değil, ve ben yönlendirme anında olmak istiyorum. Ben başlıkları kullanabilir miyim? Ya şeyler o karışıklık olacak?

Alternatif olarak, ben cron iş yaklaşımı kullanabilirsiniz, ama ben bir cron işi yapmak veya php kod çalıştırmak zorunda sıfır deneyime sahip (hatta mümkün mü?)

Thanks,
Mala

Update:
Using headers to redirect does not work - the page will not load until the script is done. However, eventually the webserver times out and says "Zero-Sized Reply: The requested URL could not be retrieved" (although the script continues running). I guess my only option is to go with the cron job idea. Ick!

4 Cevap

Ben çeşitli yöntemler denedim ve hiçbiri işe gibi görünüyor, ben bile register_shutdown_function() kullanmak denedim ama bu da başarısız oldu. Ben bir cron işi yapma ile sıkışmış sanırım.

I just remembered something (but I haven't tested it), you can try to do something like this:

set_time_limit(0);
ignore_user_abort(true);

ob_start(); // not sure if this is needed

// meta refresh or javascript redirect

ob_flush(); // not sure if this is needed
flush();

// code to process here

exit();

Emin değil o iş olacak ama bunu deneyebilirsiniz eğer.

Benim için en bariz çözüm iki ayrı dosyalarda yönlendirme ve plan hesaplama bölme olması ve yönlendirme komut 10 dakikalık komut dosyası çalıştırmasına izin istiyorum:

job.php:

<?php
// do the nasty calculation here

redirect.php:

<?php
// start the script and redirect output of the script to nirvana, so that it
// runs in the background
exec ('php /path/to/your/script/job.php >> /dev/null 2>&1 &'); 

// now the redirect
header ('Location /index.php');

Bunun için Varsayımlar çalışmak için: Sen safe_mode devre dışı veya uygun safe_mode_exec_dir set olan biriyle bir Linux ana olmalıdır. Eğer windows altında çalışan olduğunuzda safe_mode hakkında Gerisi doğru kalırken, exec dize, adapte edilmesi gerekiyor.

Uyarı: Kullandığınız escapeshellarg() geçirmeden önce, bakın, komut argüman geçmek gerektiğinde de PHP manual on exec

I have a similar situation with processing logins. To keep it short... I get a PDT, IPN and each sends me a logging email. An email is sent to client on IPN VERIFIED to give serial number and password to client. As PDT and IPN I use goto to send me a logging email instead of a bunch of sequential ifs. On reading many answers I studied each to figure what would suit my isssue. I finally used...

<?php
  ignore_user_abort(TRUE); // at very top

Ben ilerici kontroller (hayır IFS) aracılığıyla çalıştı onlar başarısız olursa, ben örneğin kullanabilirsiniz ...

  $mcalmsg .= "Check [serialnbr]\r\n";
  if (empty($_POST['serialnbr']))
    {    header('Location: '.$returnurl.'?error=1');
      $mcalmsg .= "Missing [serialnbr]\r\n";
      goto mcal_email; // Last process at end of script        
    }
    else
    {$serialnbr=strtoupper(htmlspecialchars(trim($_POST['serialnbr'])));
     $mcalmsg .= "[serialnbr]=$serialnbr\r\n";
    }

This (so far) is working just as needed. Of course there is more in the script but follows the same concept. Where this says location, there are also 3 information pages that can each be displyed using the same concept.

mcal_email: //last process before ending, always gets here after all else from goto or clearing all checks.
 // compose email and send
?> // end of script

Neden başlık yaklaşım deneyin ve neler olacağını görmek değil? Ayrıca php başlık yöntemi çağrısı deneyin ve bu hile yaparsa görebiliyordu. Ben sorununuzu çözecektir görmek için deneme yanılma üzerinde çalışmak istiyorum.