Saya menjalankan permintaan ikal pada basis data eXist melalui php. Dataset sangat besar, dan sebagai hasilnya, database secara konsisten membutuhkan waktu lama untuk mengembalikan respons XML. Untuk memperbaikinya, kami menyiapkan permintaan ikal, dengan apa yang seharusnya menjadi batas waktu yang lama.
$ch = curl_init();
$headers["Content-Length"] = strlen($postString);
$headers["User-Agent"] = "Curl/1.0";
curl_setopt($ch, CURLOPT_URL, $requestUrl);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, 'admin:');
curl_setopt($ch,CURLOPT_TIMEOUT,1000);
$response = curl_exec($ch);
curl_close($ch);
Namun, permintaan ikal secara konsisten berakhir sebelum permintaan selesai (<1000 ketika diminta melalui browser). Adakah yang tahu apakah ini cara yang tepat untuk mengatur batas waktu dalam ikal?
set_time_limit(0);
jika skrip berjalan di konsol.php -d max_execution_time=1 -r 'while(true){$r=1*1;}'
atau melakukan sesuatu untuk mengamati bahwa cli tidak memiliki bendera 'selalu tak terbatas' sihir.set_time_limit(0)
jika Anda tidak menggunakannya di dalam lingkaran.Hmm, menurut saya seperti
CURLOPT_TIMEOUT
mendefinisikan jumlah waktu yang harus dijalankan oleh setiap fungsi CURL. Saya pikir Anda harus benar-benar melihatCURLOPT_CONNECTTIMEOUT
sebaliknya, karena itu memberi tahu CURL jumlah waktu maksimum untuk menunggu koneksi selesai.sumber
CURLOPT_TIMEOUT
tentang berapa lama fungsi tersebut, dokumen pustaka ikal yang mendasarinya sepertinya mengatakan itu tentang berapa lama permintaan, yang merupakan perbedaan yang menarik - tidak yakin cara membaca yang mana!Ada kekhasan dengan ini yang mungkin relevan bagi sebagian orang ... Dari komentar PHP docs.
Dari http://www.php.net/manual/en/function.curl-setopt.php#104597
sumber
Kode Anda menetapkan batas waktu hingga 1000 detik . Untuk milidetik, gunakan
CURLOPT_TIMEOUT_MS
.sumber
Anda perlu memastikan batas waktu antara Anda dan file. Dalam hal ini PHP dan Curl.
Untuk memberi tahu Curl agar tidak pernah kehabisan waktu saat transfer masih aktif, Anda harus mengatur
CURLOPT_TIMEOUT
ke0
, sebagai ganti1000
.Di PHP, sekali lagi, Anda harus menghapus batas waktu atau PHP sendiri (setelah 30 detik secara default) akan mematikan skrip bersama permintaan Curl. Ini saja harus memperbaiki masalah Anda .
Selain itu, jika Anda memerlukan integritas data, Anda bisa menambahkan lapisan keamanan dengan menggunakan
ignore_user_abort
:Pemutusan klien akan mengganggu pelaksanaan skrip dan kemungkinan merusak data,
misalnya. permintaan basis data non-transisional, membangun file konfigurasi, ecc., sementara dalam kasus Anda itu akan mengunduh sebagian file ... dan Anda mungkin, atau tidak, peduli dengan hal ini.
Menjawab pertanyaan lama ini karena utas ini ada di urutan teratas pada pencarian mesin
CURL_TIMEOUT
.sumber
Anda tidak dapat menjalankan permintaan dari browser, itu akan kehabisan waktu menunggu server menjalankan permintaan CURL untuk merespons. Browser mungkin kehabisan waktu dalam 1-2 menit, batas waktu jaringan default.
Anda perlu menjalankannya dari baris perintah / terminal.
sumber
Jika Anda menggunakan PHP sebagai aplikasi fastCGI maka pastikan Anda memeriksa pengaturan batas waktu fastCGI. Lihat: PHP curl put 500 error
sumber