Apakah skrip PHP berhenti dijalankan ketika Anda menerima 504 Gateway Timeout?


8

Saya berada di server bersama (Siteground), dan karena skrip WordPress WordPress saya membutuhkan waktu lebih dari 30 detik, ia mengembalikan batas waktu 504 Gateway.

Apakah kueri saya akan berjalan dan selesai jika tidak menemukan kesalahan lebih lanjut?

Sunting: Saya bertanya mengapa saya menerima kesalahan ini kepada tim hosting saya, di sini pakar Siteground Hosting menjelaskan masalah ini sebagai berikut:

Kami menggunakan kedua Apache + Nginx di semua server kami. Apache digunakan untuk layanan web utama, sedangkan Nginx digunakan sebagai proxy-terbalik dan mendistribusikan cache. Ketika respons tidak dapat dilayani dari cache (biasanya ini merujuk pada konten dinamis) permintaan dari Nginx dilakukan terhadap Apache. Ini ketika Apache sedang memproses permintaan, meneruskannya ke situs web Anda dan sesuai dengan logika PHP, permintaan MySQL dapat dilakukan atau data lain diambil. Ketika proses ini terlalu lama dan Apache tidak mengembalikan respons pada waktu yang tepat ke Nginx Anda akan melihat kesalahan ini. Singkatnya, Apache tidak dapat mem-server permintaan karena aplikasi menyelesaikan proses dalam waktu yang diizinkan. Ini juga berarti bahwa proses yang diprakarsai kemungkinan besar tidak selesai sepenuhnya dan beberapa data / tindakan mungkin telah disimpan / dieksekusi.

Pakar itu mengatakan "initiated process most probably not completed fully",

Lebih detail tentang skenario saya: Skrip saya menambahkan produk woocommerce dengan variasi menggunakan wp_insert_postmetode ke situs web wordpress saya. Setelah produk ditambahkan, ini akan menampilkan gambar produk yang baru ditambahkan.

Ketika saya menambahkan 1 produk (40 variasi), itu melengkapi dan menampilkan gambar produk. Ketika saya menambahkan 6 produk (240 variasi), saya menerima kesalahan langsung di browser saya.

Jadi untuk lebih lanjut menguji masalah ini, saya memodifikasi kode saya dan menulis ulang menggunakan ajax dan menambahkan bar proses seperti sistem. (Yang menambah angka untuk setiap variasi).

Setelah saya menjalankan kode untuk 1 produk (dengan 40 variasi), jumlah proses meningkat menjadi 40, dan itu menampilkan gambar produk.

Ketika saya menjalankan kode saya untuk 6 produk, jumlah proses meningkat menjadi 240, tetapi tidak menampilkan apa-apa, dan ketika saya periksa, ia menerima kesalahan 504. ( jQuery.Ajaxbagian kesalahan fungsi)

Jadi ini membuat saya berpikir bahwa kueri berjalan bahkan itu timeout, tetapi masih saya tidak bisa memastikan, dan mencari rincian behing 504 kesalahan batas waktu gateway karena tidak ada dokumentasi yang baik tentang ini.


1
Ini mungkin tergantung pada dari mana batas waktu gateway berasal. Ini pertanyaan yang menarik.
Stephen Ostermiller

@StephenOstermiller menambahkan beberapa detail lagi berdasarkan komentar Anda.
HOY

Mungkin Anda akan tahu apakah skrip selesai jika semua "6 produk (240 variasi)" ditambahkan ke situs web Anda? Atau apakah itu sulit ditentukan? Mungkin menambahkan beberapa fungsionalitas logging ke skrip Anda?
MrWhite

Jawaban:


3

Script tidak akan berhenti mengeksekusi sampai mereka mencapai batas waktu php itu sendiri.

Kesalahan 504 dihasilkan pada gateway / proxy itu sendiri, itu bukan berasal dari proses php.

Itu karena ini, jika Anda memiliki Apache dengan Apache-mod-php Anda tidak akan pernah menerima kesalahan ini, karena tidak ada proxy.

Memperluas penjelasan, pikirkan sebagai berikut:

Anda memiliki proses PHP. Proses PHP dapat berupa PHP-FPM, PHP-CGI, atau Apache-MOD-PHP. Pada proses ini, Anda memiliki batas waktu (dikonfigurasi pada php.ini atau dengan ini_set).

Proxy PHP memberikan respons dalam waktu yang diizinkan (alias: jika Anda memiliki set_time_limit (600), proses PHP Anda dapat berjalan hingga 10 menit).

Tanpa kaitan dengan kalimat ini, Anda dapat memiliki proses lain menunggu respons ini: Itulah kasus apache (dikonfigurasi untuk menghubungi php dengan cgi atau fpm), nginx, a lighthttpd, dan lain-lain. Itu bukan kasus apache yang dikonfigurasi oleh apache-mod-php. Proses kedua ini, memiliki batas waktu baru (proxy_timeout), dikonfigurasi pada konfigurasi aplikasi server vhost / umum. Saat itulah program akan menunggu jawaban dari mesin pengolah PHP.

Kalimat terakhir, dapat diulang pada setiap proxy / gateway.

Pikirkan skenario ini:

haproxy (Timeout 1) -> Nginx (Frontend / cache) (Timeout 2) -> Apache (Timeout 3) -> PHP-FPM (Timeout PHP / set_time_limit).

Dan skenario yang sangat sederhana:

Apache (dengan apache-mod-php) (PHP Timeout / set_time_limit).

Setiap tampilan batas waktu (kecuali Batas Waktu PHP itu sendiri) adalah kemungkinan asal kesalahan 504 batas waktu gateway HTTP.


"Jika Anda memiliki Apache dengan Apache-mod-php Anda tidak akan pernah menerima kesalahan ini" - bisakah Anda menjelaskan kalimat terakhir ini?
MrWhite

Ketika Anda menggunakan server Apache dengan mod-php, eksekusi telah dilakukan oleh Apache itu sendiri. Karena ini, Anda tidak bisa mendapatkan batas waktu 504, karena tidak ada gateway pada proses. Jika Anda menggunakan php-cgi atau php-fpm, Apache / nginx / beberapa server web lainnya bertindak sebagai proxy atau gateway ke mesin pengolah yang sebenarnya. Kemudian, 504 kesalahan muncul ketika gateway ini tidak menerima respons dalam jumlah waktu yang dikonfigurasi.
Sakura Kinomoto

Tapi bisakah Anda tidak memiliki proxy reverse Nginx di depan Apache mod-php?
MrWhite

Jelas, tapi bukan itu pertanyaannya. Dalam hal ini, 504 dapat diberikan oleh nginx, tetapi bukan Apache. Pertanyaan pada kasus ini, adalah siapa jika 504 kode kesalahan dihasilkan oleh proxy, eksekusi yang dipicu oleh panggilan proxy tidak dihentikan. Pada kasus gateway atau proxy, setidaknya ada dua timer yang dimainkan. Batas waktu komunikasi proxy (pada nginx misalnya) dan batas waktu pada proses php.
Sakura Kinomoto

Saya mengerti. Tetapi kalimat terakhir Anda tampaknya tidak lengkap dalam kasus itu, karena itu menyiratkan bahwa hanya menggunakan Apache-mod-php (terlepas dari apakah ada proxy front-end atau tidak) akan menghindari kesalahan ini. Saya berasumsi apa yang Anda maksud adalah ... "jika Anda hanya memiliki Apache dengan Apache-mod-php dan tidak ada proxy front-end (Nginx dalam kasus ini) maka Anda tidak akan pernah menerima kesalahan ini"?
MrWhite

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.