בקשת cURL לnginx שעובדת מהקונסול אבל לא מתוך PHP
-
משהו מוזר.
יש לי כתובת URL (לוקאלי) שכשאני ניגש אליה מכרום או בפקודת cURL מהcmd התגובה תקינה, אבל כשאני ניגש אליה מקוד PHP הוא לא מגיב ונתקע בטיימאוט.הפונקציה בPHP היא:
function makeAPIRequest($url) { // Initialize cURL session $curl = curl_init(); // Enable verbose debug output $verbose = fopen('php://temp', 'w+'); curl_setopt($curl, CURLOPT_STDERR, $verbose); curl_setopt($curl, CURLOPT_VERBOSE, true); // Set cURL options curl_setopt_array($curl, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_VERBOSE => true, CURLOPT_STDERR => $verbose, CURLOPT_USERAGENT => 'PHP/cURL', CURLOPT_INTERFACE => "127.0.0.1", CURLOPT_PROTOCOLS => CURLPROTO_HTTP, CURLOPT_TIMEOUT => 10, // הקטנתי את הtimeout CURLOPT_CONNECTTIMEOUT => 5, // הוספתי timeout להתחברות CURLOPT_TCP_NODELAY => true, // נסה למנוע buffering CURLOPT_FORBID_REUSE => true, // מנע שימוש חוזר בחיבור CURLOPT_FRESH_CONNECT => true, // אכוף חיבור חדש CURLOPT_HTTPHEADER => [ "Accept: application/json", "Cache-Control: no-cache", "Connection: close", // שיניתי ל-close ], ]); // Log request start time $startTime = microtime(true); // Execute cURL request $response = curl_exec($curl); // Calculate request duration $duration = microtime(true) - $startTime; // Get request info $info = curl_getinfo($curl); // If there's an error, get verbose debug information if ($response === false) { rewind($verbose); $verboseLog = stream_get_contents($verbose); $errorDetails = [ 'error' => curl_error($curl), 'error_no' => curl_errno($curl), 'info' => $info, 'verbose_log' => $verboseLog, 'duration' => $duration, 'url' => $url ]; fclose($verbose); curl_close($curl); throw new Exception("cURL Error: " . json_encode($errorDetails, JSON_PRETTY_PRINT)); } // Close resources fclose($verbose); curl_close($curl); // Log success information error_log(sprintf( "API Request successful - URL: %s, Duration: %.2fs, Status: %d, Size: %d bytes", $url, $duration, $info['http_code'], $info['size_download'] )); // Decode JSON response $decodedResponse = json_decode($response, true); if (json_last_error() !== JSON_ERROR_NONE) { throw new Exception(sprintf( "JSON Decode Error: %s. Raw response: %s", json_last_error_msg(), substr($response, 0, 1000) )); } return $decodedResponse; }
שרת האינטרנט nginx. (עדכון: בדקתי גם באפאצי וזה ג"כ נתקע ).
בלוגים הוא ניגש לnginx127.0.0.1 - - [24/Dec/2024:16:06:05 +0200] "GET /index.php?format=json&p=chack_token_to_sp&Module=sub_projects&token_sub_project=kjsadouewio&token_user=AIAvo7yAhWqMrQJl271P&nick=administrator HTTP/1.1" 499 0 "-" "PHP/cURL"
אבל מאיזשהו סיבה הוא נתקע אח"כ.
והתגובה היא:
Error: cURL Error: { "error": "Operation timed out after 10016 milliseconds with 0 bytes received", "error_no": 28, "info": { "url": "http:\/\/g-in.com:200\/index.php?format=json&p=chack_token_to_sp&Module=sub_projects&token_sub_project=kjsadouewio&token_user=AIAvo7yAhWqMrQJl271P&nick=administrator", "content_type": null, "http_code": 0, "header_size": 0, "request_size": 278, "filetime": -1, "ssl_verify_result": 0, "redirect_count": 0, "total_time": 10.016296, "namelookup_time": 0.001899, "connect_time": 0.002136, "pretransfer_time": 0.002204, "size_upload": 0, "size_download": 0, "speed_download": 0, "speed_upload": 0, "download_content_length": -1, "upload_content_length": 0, "starttransfer_time": 0, "redirect_time": 0, "redirect_url": "", "primary_ip": "127.0.0.1", "certinfo": [], "primary_port": 200, "local_ip": "127.0.0.1", "local_port": 52303, "http_version": 0, "protocol": 1, "ssl_verifyresult": 0, "scheme": "http", "appconnect_time_us": 0, "connect_time_us": 2136, "namelookup_time_us": 1899, "pretransfer_time_us": 2204, "redirect_time_us": 0, "starttransfer_time_us": 0, "posttransfer_time_us": 2214, "total_time_us": 10016296, "effective_method": "GET", "capath": "", "cainfo": "" }, "verbose_log": "* Host g-in.com:200 was resolved.\n* IPv6: (none)\n* IPv4: 127.0.0.1\n* Trying 127.0.0.1:200...\n* Name '127.0.0.1' family 2 resolved to '127.0.0.1' family 2\n* Local port: 0\n* Connected to g-in.com (127.0.0.1) port 200\n* using HTTP\/1.x\n> GET \/index.php?format=json&p=chack_token_to_sp&Module=sub_projects&token_sub_project=kjsadouewio&token_user=AIAvo7yAhWqMrQJl271P&nick=administrator HTTP\/1.1\r\nHost: g-in.com:200\r\nUser-Agent: PHP\/cURL\r\nAccept: application\/json\r\nCache-Control: no-cache\r\nConnection: close\r\n\r\n* Request completely sent off\n* Operation timed out after 10016 milliseconds with 0 bytes received\n* closing connection #0\n", "duration": 10.016844987869263, "url": "http:\/\/g-in.com:200\/index.php?format=json&p=chack_token_to_sp&Module=sub_projects&token_sub_project=kjsadouewio&token_user=AIAvo7yAhWqMrQJl271P&nick=administrator" }
-
בשניהם מדובר באותם פרמטרים?
האם בPHP השגיאה היא גם אם תכתוב:echo file_get_contents('http://g-in.com:200/index.php?format=json&p=chack_token_to_sp&Module=sub_projects&token_sub_project=kjsadouewio&token_user=AIAvo7yAhWqMrQJl271P&nick=administrator');
?
-
Warning: file_get_contents(http:\/\/g-in.com:200\/index.php?format=json&p=chack_token_to_sp&Module=sub_projects&token_sub_project=kjsadouewio&token_user=AIAvo7yAhWqMrQJl271P&nick=administrator): Failed to open stream: No such file or directory in C:\xampp\file.php on line 338
-
Warning: file_get_contents(http://g-in.com:200/index.php?format=json&p=chack_token_to_sp&Module=sub_projects&token_sub_project=kjsadouewio&token_user=AIAvo7yAhWqMrQJl271P&nick=administrator): Failed to open stream: HTTP request failed! in C:\xampp\file.php on line 338
-
רק עכשיו הצלחתי להבין מה הסיבה לכל שורה בלוגים של הnginx.
כשאני פונה מהURL (=בגוגל כרום, מה שחוזר תקין) יוצא מה שכתוב בשורה 1 ו-2. (לא יודע למה הוא מדפיס 2 שורות כאילו זה 2 בקשות).
שורה 4 זה הבקשה בצורה ש@dovid אמר לי לעשות באמצעות file_get_contents, ושורה 5 זה הבקשה באמצעות curl.
לא יודע למה בשורה 1,4,5 הוא לא כותב את כל הדומיין אלא מתחיל מה-index.php.127.0.0.1 - - [24/Dec/2024:23:36:44 +0200] "GET /index.php?format=json&p=chack_token_to_sp&Module=sub_projects&token_sub_project=kjsadouewio&token_user=AIAvo7yAhWqMrQJl271P&nick=administrator HTTP/1.1" 200 104 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" "-" 127.0.0.1 - - [24/Dec/2024:23:36:45 +0200] "GET /favicon.ico HTTP/1.1" 200 38672 "http://g-in.com:200/index.php?format=json&p=chack_token_to_sp&Module=sub_projects&token_sub_project=kjsadouewio&token_user=AIAvo7yAhWqMrQJl271P&nick=administrator" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" "-" 127.0.0.1 - - [24/Dec/2024:23:37:56 +0200] "GET /index.php?format=json&p=chack_token_to_sp&Module=sub_projects&token_sub_project=kjsadouewio&token_user=AIAvo7yAhWqMrQJl271P&nick=administrator HTTP/1.1" 499 0 "-" "-" "-" 127.0.0.1 - - [24/Dec/2024:23:38:06 +0200] "GET /index.php?format=json&p=chack_token_to_sp&Module=sub_projects&token_sub_project=kjsadouewio&token_user=AIAvo7yAhWqMrQJl271P&nick=administrator HTTP/1.1" 499 0 "-" "PHP/cURL" "-"
@yossiz איפה אני מוצא את הלוגים של php-fpm? בתיקיית PHP אין לי בכלל תיקיית משנה של logs.
-
@chagold כתב בבקשת cURL לnginx שעובדת מהקונסול אבל לא מתוך PHP:
כשאני פונה מהURL (=בגוגל כרום, מה שחוזר תקין) יוצא מה שכתוב בשורה 1 ו-2. (לא יודע למה הוא מדפיס 2 שורות כאילו זה 2 בקשות).
זה באמת שתי בקשות
שורה 1 זה העיקר, שורה 2 הוא סתם כי כרום מנסה לבקש favicon להציג אייקון של האתר@chagold כתב בבקשת cURL לnginx שעובדת מהקונסול אבל לא מתוך PHP:
לא יודע למה בשורה 1,4,5 הוא לא כותב את כל הדומיין אלא מתחיל מה-index.php.
גם ב-2 זה מתחיל ככה. תמיד בקשת HTTP הוא ככה (הדומיין נמצא ב-header בשם host). השדה השני שכולל כל הדומיין הוא ה-referrer (ככה זה מוגדר בברירת מחדל. אפשר לשנות את הפורמט של הלוג בהגדרות)
@chagold כתב בבקשת cURL לnginx שעובדת מהקונסול אבל לא מתוך PHP:
איפה אני מוצא את הלוגים של php-fpm? בתיקיית PHP אין לי בכלל תיקיית משנה של logs.
אני לא יודע אצלך אם זה מוגדר עם php-fpm או עם משהו אחר, אני גם לא יודע איפה אתה יכול לחפש לוגים