בקשת 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 או עם משהו אחר, אני גם לא יודע איפה אתה יכול לחפש לוגים
-
רק עכשיו הצלחתי לגרום לו לכתוב את הלוגים של php-fpm.
תכלס, הלוג מדפיס רק את הבקשה של @dovid את שלי הוא לא מדפיס.
אבל במה שהוא מדפיס נוסף טקסט 'amp;
' כמה פעמים.[26-Dec-2024 07:52:20 UTC] PHP 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 339 [26-Dec-2024 07:52:20 UTC] API call failed: Failed to get contents
-
אבל לא התוים הנוספים הם הסיבה. כי עשיתי טסט בלי פרמטרים בכלל. ועדיין..
[26-Dec-2024 08:08:38 UTC] PHP Warning: file_get_contents(http://g-in.com:200/index.php): Failed to open stream: HTTP request failed! in C:\xampp\file.php on line 340 [26-Dec-2024 08:08:38 UTC] API call failed: Failed to get contents
-
@chagold כתב בבקשת cURL לnginx שעובדת מהקונסול אבל לא מתוך PHP:
אבל לא התוים הנוספים הם הסיבה. כי עשיתי טסט בלי פרמטרים בכלל. ועדיין..
[26-Dec-2024 08:08:38 UTC] PHP Warning: file_get_contents(http://g-in.com:200/index.php): Failed to open stream: HTTP request failed! in C:\xampp\file.php on line 340 [26-Dec-2024 08:08:38 UTC] API call failed: Failed to get contents
יש לך שני אתרי PHP אם הבנתי נכון, ואתה מנסה לעשות קריאה מאחד לשני
הלוג פה מראה רק את הקריאה של file_get_contents
האם אתה בטוח שהאתר השני (g-in.com:200) גם עובר דרך php-fpm?אם לא, אז מה כן?
אתה יכול להראות את הקונפיגרציה של השרת אפאצ'י או nginx? -
זה לוג רק של שגיאות.
הוא נוצר באמצעות הקוד הזה -c:\tools\nssm.exe set PHP-FPM AppParameters "-b 127.0.0.1:9000 -d error_log=C:/php/logs/php-fpm.log -d display_errors=1 -d log_errors=1 -d error_reporting=E_ALL"
לא הצלחתי לעשות לוג של כל הבקשות
# nginx.conf - Combined Configuration worker_processes 1024; error_log "C:/nginx/logs/error.log"; #error_log logs/error.log notice; #error_log logs/error.log info; events { worker_connections 1024; } http { include "C:/nginx/conf/mime.types"; default_type application/octet-stream; charset utf-8; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; log_format debug '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' 'rt=$request_time ua="$upstream_addr" ' 'us="$upstream_status" ut="$upstream_response_time" ' 'ul="$upstream_response_length" ' 'cs=$upstream_cache_status'; access_log logs/access.log debug; access_log "C:/nginx/logs/access.log" main; sendfile on; keepalive_timeout 65; # FastCGI Settings fastcgi_buffers 8 16k; fastcgi_buffer_size 32k; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; # Default server (port 80) server { charset utf-8; listen 80; server_name localhost; root C:/xampp/reko; location / { index index.php index.html index.htm; try_files $uri $uri/ /index.php?$args; autoindex on; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } # Port 200 server (reko) server { listen 200; server_name localhost; root C:/xampp/reko; location / { index index.php index.html index.htm; try_files $uri $uri/ /index.php?$args; autoindex on; proxy_connect_timeout 10; proxy_send_timeout 10; proxy_read_timeout 10; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } }
והקונפיגורציה של php-fpm
[global] pid = C:/nginx/php-fpm.pid error_log = C:/php/logs/php-fpm.log [www] listen = 127.0.0.1:9000 listen.allowed_clients = 127.0.0.1 user = nobody pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 access.log = C:/php/logs/php-fpm-access.log catch_workers_output = yes