Yoğun PHP script "belirtilen zaman aşımı süresi doldu" w / başarısız

6 Cevap

Başarısız bir MySQL yoğun PHP komut dosyası çalıştıran. Apache günlük Bu raporlar:

[Wed Jan 13 00:20:10 2010] [error] [client xxx.xx.xxx.xxxx] (70007)
The timeout specified has expired:
ap_content_length_filter: apr_bucket_read() failed,
referer: http://domain.com/script.php

Üstündeki set_time_limit(0) koyarak çalıştı.

Ayrıca çalıştı set_time_limit(0)

Aşımını sabit ne.

Bunu önlemek için ben http.conf (veya başka bir yerde) kadar olabilir bazı özel zaman aşımı sınırı var mı?

6 Cevap

Php max_execution_time direktifi da bulunuyor. Web sunucunun zaman aşımı ayarları da komut sınırlayıcı olabilir unutmayın:

Your web server can have other timeout configurations that may also interrupt PHP execution. Apache has a Timeout directive and IIS has a CGI timeout function. Both default to 300 seconds. See your web server documentation for specific details.

Aslında, bu bir Apache hata gibi, o da Python komut etkiler görünüyor. Denedim googling it yet?

Değil php kendisi ama apache sunucusuna yerleştirilen başka bir zaman aşımı değeri vardır. PHP zor işi yaparken hiçbir şey belirtilen süre boyunca çıkış üzerinde fren komut yüzden bu sınıra ulaşabilir olacaktır. Sadece bildiğim kadarıyla o KeepAliveTimeout apache mülkiyet hatırlıyorum gibi (! Tamponlar değil) ya da güvenli değere apache zaman aşımı değerini artırmak geri tarayıcınıza şey echo. İyi şanslar :)

Birincisi, benim çözüm Apache Web Sunucusu için geçerlidir.

Ben çok çok büyük bir db karşı bir rapor için bir teslim indir komut dosyası olarak hareket etmek içindir bir senaryo üzerinde çalışıyorum, ve ben de bu sorunla karşılaştı. Php kullanarak değilim, ama bunun yerine benim senaryom heitml ;-) denilen bazı karanlık dilinde yazılmış

Istek zaman aşımı problemli benim gibi bu senaryoda meydana gelir:

[Wed Sep 19 20:29:01 2012] [warn] [client ::1] Timeout waiting for output from CGI script /var/www/cgi-bin/heitml
[Wed Sep 19 20:29:01 2012] [error] [client ::1] (70007)The timeout specified has expired: ap_content_length_filter: apr_bucket_read() failed

Ve ben şu anda burada bu resmi aşımı yapılandırma uzantısı kullanıyor uyum sağlayabilen tek ciddi çözüm: mod_reqtimeout. Bu örneğin gibi zaman aşımı params ayarlanmasını sağlar:

Istek gövdesini almak için başlıkları ve 30 saniye dahil isteği almak için 10 saniye izin ver:

RequestReadTimeout header=10 body=30

En az 10 saniye istek gövdesini almak için izin. Müşteri veri gönderirse, (LimitRequestBody dolaylı verilen sınırın exept) zaman aşımı için herhangi bir üst limit ile alınan her 1000 bayt için 1 saniye zaman aşımı süresini artırın:

RequestReadTimeout body=10,MinRate=1000

En az 10 saniye başlıklar dahil isteğini almak için izin verin. Müşteri veri gönderirse, alınan her 500 byte için 1 saniye zaman aşımı süresini artırın. Ama başlıklar dahil istek için 30 saniye daha fazla izin vermez:

RequestReadTimeout header=10-30,MinRate=500

Genellikle, bir sunucu başlık ve yapılandırılmış vücut zaman aşımı hem de olmalıdır. Ortak bir yapılandırma http için kullanılan ve sanal konaklar https ise, zaman aşımı çok düşük ayarlanmış olmamalıdır:

RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500

Bana (- bu 2.2.15 ve sonraki tüm sürümleri dahil ediyor olsa da varsayılan olarak yüklü değil varsayarak) bir bu modülü kullanmak gerekmez Apache tarafından sunulan daha iyi bir çözüm var olup olmadığını öğrenmek için henüz duyuyorum.

I Apache 2.4.6 ve PHP 5.4.23 FPM/FastCGI ile de çok benzer bir duvara çarptı.

Symptom:

Ne olursa olsun ben PHP veya Apache ayarlamak ne, benim komut dosyası 30 saniye içinde zaman aşımı olacak ve ben benim Apache hata günlüğüne aşağıdaki görecekti:

[timestamp] [proxy_fcgi:error] [pid...] (70007)The timeout specified has expired: [client ...] AH01075: Error dispatching request to :

My VirtualHost:

TimeOut  300
KeepAliveTimeout 300

<IfModule reqtimeout_module>
  RequestReadTimeout header=120-240,minrate=500
  RequestReadTimeout body=120,minrate=500
</IfModule>

<IfModule mod_proxy.c>
  ProxyTimeout 300
</IfModule>

<IfModule mod_fcgid.c>
  FcgidConnectTimeout 300
</IfModule>

The pesky php script:

ini_set( 'max_execution_time', '120' );
...
ini_restore( 'max_execution_time' );

The Fix: it's a hard coded value in Apache mod_proxy_fcgi

Take a look at the bug report here

  • A patch mevcuttur (yukarıdaki link)
  • Düzeltme (Mar 2014) henüz genel yayın için planlanan olması görünmüyor

Ben sorunu gidermek için php.ini bu kaynak limitleri ile yaklaşık oynadı.

max_execution_time = 300
max_input_time = 300
memory_limit = -1

php.ini gibi bir zaman aşımı vardır.