cUrl ทำงานได้ดีบน localhost แต่ไม่ทำงานบนเซิร์ฟเวอร์และแสดงเฉพาะหน้าว่างเท่านั้น

เมื่อฉันเรียกใช้โค้ดด้านล่างบนเซิร์ฟเวอร์ มันจะแสดงเฉพาะหน้าว่างและหยุดการดำเนินการต่อไปกะทันหัน ฉันยังตรวจสอบ cUrl บนเซิร์ฟเวอร์ที่ติดตั้งไว้ด้วย

นี่คือรหัสของฉัน

$ftp_server = 'ftps://'.'server/Voorraadtonen link.csv'; 
$ch = curl_init(str_replace(" ","%20",$ftp_server));
curl_setopt($ch, CURLOPT_URL, $ftp_server);
curl_setopt($ch, CURLOPT_USERPWD,'username'.':'.'password');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_FTP_SSL, CURLFTPSSL_TRY);
curl_setopt($ch, CURLOPT_FTPSSLAUTH, CURLFTPAUTH_TLS);
//curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_PORT, 990);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');
curl_setopt($ch, CURLOPT_VERBOSE,true);
$output = curl_exec($ch);
$error_no = curl_errno($ch);
echo $output; exit;

person Haq Nawaz    schedule 26.01.2020    source แหล่งที่มา
comment
อ่านไฟล์ error_log ของคุณและเปิดใช้งานการรายงานข้อผิดพลาดเกี่ยวกับการรายงานข้อผิดพลาดของ curl หรือ php if(curl_errno($ch)){ throw new Exception(curl_error($ch)); }   -  person Dlk    schedule 26.01.2020
comment
เปิดใช้งานการรายงานข้อผิดพลาดแล้ว error_reporting(E_ALL); ini_set('display_errors', 1);   -  person Haq Nawaz    schedule 26.01.2020
comment
คุณควรมีข้อผิดพลาด ใช้รหัสของฉันที่ให้ไว้ในความคิดเห็นและอ่านไฟล์ error_log ของคุณ   -  person Dlk    schedule 26.01.2020
comment
ฉันใช้มันแต่ไม่มีอะไรแสดง   -  person Haq Nawaz    schedule 26.01.2020
comment
ลองสิ่งนี้ใน url ของคุณ curl -u user:password 'ftps://mysite/%2fusers/myfolder/myfile/csv' -o ~/folder/link.csv   -  person Dlk    schedule 26.01.2020
comment
ฉันไม่คิดว่าคุณจะได้อะไรจาก url นี้ ftps://''.'server/Voorraadtonen link.csv   -  person Dlk    schedule 26.01.2020
comment
คุณได้รับอะไรใน $error_no หรือไม่?   -  person Nigel Ren    schedule 26.01.2020
comment
ไม่ ฉันไม่ได้รับอะไรเลยใน $error_no   -  person Haq Nawaz    schedule 26.01.2020


คำตอบ (1)


อัปเดตล่าสุด!

คุณมีข้อผิดพลาดมากกว่า 1 รายการในรหัสของคุณ

คุณกำลังใช้ FTPS ใน url ซึ่งต้องมีการตรวจสอบ SSL และเป็นเท็จในรหัสของคุณ

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
//Dont use try! you shouldnt use
curl_setopt($ch, CURLOPT_FTP_SSL, CURLFTPSSL_TRY);

พวกเขาควรจะเป็นจริง : SSL ไม่สนับสนุน true ดังนั้นพวกเขาควรจะเป็นเหมือนการติดตาม @dharman warn ในคำตอบอื่น

แต่การเปลี่ยน ssl เป็นจริงจะต้องมีการตั้งค่าอื่นเช่น cacert file เป็นต้น

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
//and include cacert.pem
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');

ดาวน์โหลดไฟล์ cacert ที่นี่: https://curl.haxx.se/docs/caextract.html

2.URL ของคุณไม่ใช่ URL จริง $ftp_server = 'ftps://'.'server/Voorraadtonen link.csv'; URL นี้จะไม่ได้รับอะไรเลย แต่ควรส่งคืนข้อผิดพลาดอย่างน้อยในไฟล์ error_log ตามที่คุณบอกว่าเปิดใช้งานการรายงานข้อผิดพลาดทั้งหมดแล้ว

3.โค้ดของคุณควรมีลักษณะเช่นนี้

$curl = curl_init();
$file = fopen("link.csv", 'w');
curl_setopt($curl, CURLOPT_URL, "ftp://ftp.site.com/link.csv"); 
//Make sure for correct url
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($curl, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
//Make sure for correct url
curl_setopt($curl, CURLOPT_FILE, $file); 
curl_setopt($curl, CURLOPT_USERPWD, "$_FTP[username]:$_FTP[password]");
//Make sure for your ftp credentials
curl_setopt($curl, CURLOPT_TIMEOUT, 20); //20 seconds will be enough
curl_exec($curl);
echo curl_errno($ch);
echo curl_error($ch);
curl_close($curl);
fclose($file);

ไม่ควรจำเป็นต้องมีส่วนหัวที่เหลืออีก 1 รายการ แต่ในกรณีที่จำเป็น

curl_setopt($curl, CURLOPT_HEADER, false); //Or
curl_setopt($curl, CURLOPT_HEADER, true);

ตอนนี้มันควรจะทำงานได้โดยไม่มีปัญหาใด ๆ

หมายเหตุ : โค้ดตัวอย่างเป็นตัวอย่างการทำงานที่คุณสามารถแก้ไขได้ตามความต้องการของคุณ

อัปเดต : หลังจากแก้ไข คุณบอกว่าคุณได้ทำในโค้ดของคุณ (ยังไม่แสดงให้เราเห็น) ในที่สุดเราก็ได้รับข้อผิดพลาด ฉันขอให้คุณเพิ่มรหัสที่แก้ไขในคำถามของคุณอีกครั้ง

Error_no 28 ข้อผิดพลาด cURL 28: การเชื่อมต่อหมดเวลา

ข้อผิดพลาด cURL 28 เกิดขึ้นเมื่อคำขอ cURL ไม่เสร็จสิ้นภายในระยะเวลาหนึ่ง

สิ่งนี้เกิดขึ้นเมื่อตั้งค่าการหมดเวลา cURL ต่ำเกินไป หรือเมื่อไฟร์วอลล์บล็อกคำขอ cURL

ความเป็นไปได้อีกอย่างหนึ่งคือโมดูลความปลอดภัย เช่น โมดูล Apache mod_security

หากต้องการแก้ไขข้อผิดพลาด cURL 28 คุณสามารถติดต่อผู้ให้บริการโฮสติ้งของคุณได้

โดยพื้นฐานแล้ว!

เซิร์ฟเวอร์ของคุณกำลังบล็อก ข้อมูลประจำตัวของคุณไม่ตรงกับข้อมูลประจำตัวที่จำเป็น เซิร์ฟเวอร์จำเป็นต้องใช้ SSL แต่คุณไม่ได้ตั้งค่าไว้ ฟังก์ชั่นของคุณใช้งานการตั้งค่าขีดจำกัดหน่วยความจำเซิร์ฟเวอร์ได้สูงสุด

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, "ftp.site.com/link.csv"); 
//make sure your path to file is correct
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($curl, CURLOPT_USERPWD, "$_FTP[username]:$_FTP[password]");
//make sure your login credentials correct
    curl_setopt($curl, CURLOPT_TIMEOUT, 500);
//Set timeout for connection
    curl_exec($curl);
    echo curl_errno($ch);
    echo curl_error($ch);
//Get errors
    curl_close($curl);
//Importand close curl connection.
person Dlk    schedule 26.01.2020
comment
@HaqNawaz อัปเดตคำถามและแสดงสิ่งที่คุณทำได้ - person Dlk; 26.01.2020
comment
ฉันใช้รหัสเดียวกันบน localhost ซึ่งทำงานและดึงข้อมูล แต่บนเซิร์ฟเวอร์ มันไม่ทำงานแม้ว่าจะไม่แสดงข้อผิดพลาดใดๆ ก็ตาม และฉันได้เปิดใช้งานการรายงานข้อผิดพลาดและเพิ่มเวลาดำเนินการแต่ไม่มีอะไรแสดงเลย - person Haq Nawaz; 26.01.2020
comment
Localhost และเซิร์ฟเวอร์สดทำงานแตกต่างกัน 1 ในนั้นคือ SSL localhost ไม่ต้องการ แต่เซิร์ฟเวอร์สดทำ CURLOPT_RETURNTRANSFER ควรเปิดใช้งานสด แต่ไม่จำเป็นบนเครื่อง ส่วนหัว http อาจจำเป็นบนเซิร์ฟเวอร์สด มีหลายสิ่งที่ฉันทำได้ บอกแล้วคุณอยากจะทำให้มันได้ผลเหรอ? แก้ไขคำถามของคุณและเพิ่มรหัสล่าสุดที่คุณลอง และ ใช้ตัวอย่างในคำถามของฉัน มันใช้งานได้ดี ฉันทดสอบเป็นการส่วนตัว และเพิ่มคนอื่นๆ ทีละขั้นตอน เพื่อให้คุณสามารถค้นหาสิ่งที่ผิดปกติได้ เราไม่สามารถเดาเกี่ยวกับการตั้งค่าและรหัสของคุณได้ หากคุณไม่แสดงให้เราเห็นและไม่ลองใช้สิ่งที่เราพูด - person Dlk; 26.01.2020
comment
ฉันทำการเปลี่ยนแปลงและมันทำให้ฉันผิดพลาด 28 - person Haq Nawaz; 27.01.2020
comment
@HaqNawaz อย่างน้อยก็ดีแสดงให้เราเห็นบางสิ่งบางอย่าง คุณควรลองใช้โค้ดของฉัน ข้อผิดพลาดหมายถึงการเชื่อมต่อหมดเวลา ดังนั้น 1.วาง curl_close($ch); นี้ไว้ใต้ $curl error_no และลบ exit; ในโค้ดของคุณ อาจเป็นเพราะว่า curl ของคุณทำงานได้ไม่มีที่สิ้นสุด 2.ตั้งเวลาหมดเวลา curl_setopt($ch, CURLOPT_TIMEOUT, 500); 3. บางครั้งส่วนหัวทำให้เกิดปัญหาเช่นกัน ดังนั้นให้เปลี่ยนส่วนหัวเป็นเท็จและดูผลลัพธ์หากทำให้เกิดปัญหา ฉันอัปเดตคำตอบ เพิ่มการหมดเวลา และโปรดเพิ่มรหัสล่าสุดที่คุณลองและได้รับข้อผิดพลาด 28 - person Dlk; 27.01.2020
comment
ขอบคุณสำหรับคำตอบ ฉันซาบซึ้ง ฉันยังเพิ่มการหมดเวลาเป็น 500 แต่จากนั้นก็ไม่แสดงอะไรเลย curl_setopt($curl, CURLOPT_TIMEOUT, 500); - person Haq Nawaz; 27.01.2020
comment
@HaqNawaz ลองใช้โค้ดที่สองเป็นคำตอบเพราะมันไม่เปลี่ยนแปลงอะไรเลย เพียงใส่พา ธ ไปยังไฟล์และข้อมูลการเข้าสู่ระบบของคุณแล้วดูว่าใช้งานได้หรือไม่ - person Dlk; 27.01.2020