PHP cURL proxy: Gửi request qua HTTP và SOCKS5 có xác thực
PHP cURL proxy là cách cho mã PHP gửi yêu cầu HTTP qua một máy chủ proxy bằng thư viện cURL có sẵn trong PHP. Lập trình viên cần cách này khi viết công cụ thu thập dữ liệu, gọi API bị giới hạn theo IP, kiểm tra nội dung theo vùng, hoặc khi máy chủ nằm sau proxy công ty. Bài này ProxyVN hướng dẫn các tuỳ chọn proxy của cURL, cách dùng HTTP và SOCKS5 có mật khẩu, xoay proxy, cấu hình trong Guzzle và Laravel, cùng cách đọc lỗi. Xem thêm dịch vụ tại ProxyVN.
Tổng quan về PHP cURL proxy
cURL trong PHP là phần mở rộng bọc thư viện libcurl, cho phép gửi yêu cầu HTTP, HTTPS, FTP và nhiều giao thức khác. Phần lớn bản cài PHP trên máy chủ đã bật sẵn phần mở rộng này. Tài liệu chính thức nằm ở mục cURL trong PHP Manual.
Mọi thiết lập của một yêu cầu cURL đều qua hàm curl_setopt, trong đó có nhóm tuỳ chọn riêng cho proxy. Vì PHP dùng chính libcurl, các khái niệm giống hệt lệnh curl dòng lệnh. Nếu anh em đã quen tham số -x của curl, chuyển sang PHP rất nhanh. Phần dòng lệnh có trong bài cURL proxy là gì, bài này chỉ nói phần trong mã PHP.
Khi nào cần PHP cURL proxy
- Thu thập dữ liệu: lấy giá, thông tin sản phẩm, bài viết từ nhiều trang mà không bị chặn IP máy chủ.
- Gọi API giới hạn tần suất theo IP: chia yêu cầu qua nhiều IP để không chạm ngưỡng.
- Kiểm tra nội dung theo vùng: xem website hiển thị gì với người dùng ở Việt Nam, Mỹ hay Nhật.
- Máy chủ sau proxy công ty: máy chủ nội bộ chỉ ra Internet qua proxy.
- Ẩn IP máy chủ gốc: không để website đích biết IP của máy chủ đang chạy ứng dụng.

Đường đi của request qua proxy
Các khái niệm cần nắm trước
Proxy có địa chỉ (host), cổng (port), kiểu (HTTP hoặc SOCKS) và có thể cần xác thực. Khi gửi yêu cầu tới địa chỉ HTTPS qua proxy HTTP, cURL mở đường hầm bằng lệnh CONNECT, nội dung vẫn được mã hoá đầu cuối. Khi dùng SOCKS5, có thêm lựa chọn để proxy phân giải tên miền hay để máy tự phân giải. Hiểu bốn điểm này là đủ để đọc mọi đoạn mã proxy trong PHP.
Các tuỳ chọn PHP cURL proxy quan trọng
Danh sách đầy đủ có trong trang curl_setopt của PHP Manual. Dưới đây là các tuỳ chọn hay dùng nhất khi làm việc với proxy.

Các tuỳ chọn proxy trong cURL
Tuỳ chọn |
Ý nghĩa |
Giá trị ví dụ |
|---|---|---|
CURLOPT_PROXY |
Địa chỉ proxy |
"103.x.x.x:8080" |
CURLOPT_PROXYPORT |
Cổng proxy nếu không ghi trong địa chỉ |
8080 |
CURLOPT_PROXYTYPE |
Kiểu proxy |
CURLPROXY_HTTP, CURLPROXY_SOCKS5_HOSTNAME |
CURLOPT_PROXYUSERPWD |
Tài khoản và mật khẩu proxy |
"user:matkhau" |
CURLOPT_PROXYAUTH |
Kiểu xác thực với proxy |
CURLAUTH_BASIC |
CURLOPT_HTTPPROXYTUNNEL |
Ép mở đường hầm CONNECT |
true |
CURLOPT_NOPROXY |
Danh sách tên miền không dùng proxy |
"localhost,127.0.0.1" |
CURLOPT_CONNECTTIMEOUT |
Thời gian chờ kết nối tối đa |
10 |
CURLOPT_TIMEOUT |
Thời gian chờ toàn bộ yêu cầu |
30 |
CURLOPT_PROXY và CURLOPT_PROXYPORT
Có thể ghi cổng ngay trong địa chỉ như "host:port" hoặc tách riêng bằng CURLOPT_PROXYPORT. Có thể ghi cả tiền tố giao thức như "socks5h://host:port", khi đó libcurl tự hiểu kiểu proxy mà không cần CURLOPT_PROXYTYPE. Cách ghi tiền tố gọn hơn khi lưu danh sách proxy trong tệp cấu hình.
CURLOPT_PROXYTYPE
Giá trị CURLPROXY_HTTP là mặc định. CURLPROXY_SOCKS5 dùng SOCKS5 và để máy tự phân giải tên miền. CURLPROXY_SOCKS5_HOSTNAME dùng SOCKS5 và để proxy phân giải tên miền, tương đương tiền tố socks5h. Với công việc thu thập dữ liệu hay cần ẩn danh, nên dùng bản HOSTNAME để truy vấn DNS không đi từ máy chủ của anh em.
CURLOPT_PROXYUSERPWD
Truyền chuỗi "user:matkhau". Khác với khi ghi trong URL, ở đây mật khẩu có ký tự đặc biệt không cần mã hoá URL, trừ dấu hai chấm vì nó dùng để tách tài khoản và mật khẩu. Đây là lý do nên dùng tuỳ chọn riêng thay vì nhét tài khoản vào CURLOPT_PROXY.
Thời gian chờ
Proxy chết hoặc chậm sẽ làm yêu cầu treo rất lâu nếu không đặt thời gian chờ. CURLOPT_CONNECTTIMEOUT giới hạn thời gian mở kết nối, CURLOPT_TIMEOUT giới hạn cả yêu cầu. Với công cụ chạy nhiều proxy, thời gian chờ kết nối 5 đến 10 giây là hợp lý để bỏ nhanh proxy hỏng.
Mã mẫu PHP cURL proxy cơ bản
Đoạn mã dưới gửi một yêu cầu GET qua proxy HTTP có mật khẩu và in ra IP mà website đích nhìn thấy.
<?php
$ch = curl_init('https://api.ipify.org?format=json');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_PROXY => '103.x.x.x:8080',
CURLOPT_PROXYTYPE => CURLPROXY_HTTP,
CURLOPT_PROXYUSERPWD => 'user:matkhau',
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_TIMEOUT => 30,
]);
$body = curl_exec($ch);
if ($body === false) {
echo 'Loi ' . curl_errno($ch) . ': ' . curl_error($ch);
} else {
echo $body;
}
curl_close($ch);
Giải thích từng phần
curl_init tạo phiên với địa chỉ đích. curl_setopt_array đặt nhiều tuỳ chọn cùng lúc, gọn hơn gọi curl_setopt nhiều lần. CURLOPT_RETURNTRANSFER cho curl_exec trả về nội dung thay vì in thẳng ra. Khi curl_exec trả false, curl_errno và curl_error cho biết lỗi gì. Nếu kết quả in ra là IP của proxy, cấu hình đã đúng.
Phiên bản dùng SOCKS5
Chỉ cần đổi kiểu proxy:
curl_setopt($ch, CURLOPT_PROXY, '103.x.x.x:1080');
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'user:matkhau');
Cổng SOCKS5 thường khác cổng HTTP, kiểm tra trong trang quản lý proxy. Khác biệt giữa hai giao thức và khi nào nên chọn loại nào được so sánh trong bài proxy HTTP và SOCKS5.
Kiểm tra phiên bản libcurl
Hàm curl_version() trả về mảng thông tin, trong đó có phiên bản libcurl và các giao thức được hỗ trợ. Bản libcurl quá cũ có thể thiếu một số tính năng như proxy HTTPS. Trên máy chủ dùng chung, đây là bước nên làm trước khi kết luận mã sai.
PHP cURL proxy có xác thực
Proxy trả phí thường xác thực bằng tài khoản mật khẩu hoặc bằng danh sách IP được phép (whitelist). Mỗi cách cần cấu hình khác nhau trong PHP.
Xác thực bằng tài khoản mật khẩu
Dùng CURLOPT_PROXYUSERPWD như mã mẫu. Mặc định cURL dùng kiểu Basic. Một số proxy công ty dùng NTLM hoặc Negotiate, khi đó đặt CURLOPT_PROXYAUTH thành CURLAUTH_NTLM hoặc CURLAUTH_ANY để cURL tự thương lượng.
Xác thực bằng IP whitelist
Thêm IP công khai của máy chủ chạy PHP vào trang quản lý proxy, sau đó không cần CURLOPT_PROXYUSERPWD. Cách này tiện cho máy chủ có IP tĩnh. Với máy chủ trên nền tảng đám mây có IP ra thay đổi, whitelist dễ hỏng. So sánh ưu nhược hai cách có trong bài xác thực proxy bằng IP whitelist hay user password.
Nhận mã 407
Khi proxy trả 407 Proxy Authentication Required, nghĩa là xác thực thiếu hoặc sai. Kiểm tra lại tài khoản, mật khẩu, kiểu xác thực, và IP máy chủ đã có trong whitelist chưa. Với yêu cầu HTTPS, lỗi 407 thường hiện dưới dạng lỗi đường hầm thay vì mã phản hồi. Nguyên nhân chi tiết có trong bài sửa lỗi 407 Proxy Authentication Required.
Lưu thông tin proxy an toàn
Không viết tài khoản mật khẩu proxy cứng trong mã nguồn. Đặt trong biến môi trường hoặc tệp .env không đưa lên kho Git, đọc bằng getenv hay thư viện cấu hình của framework. Lộ mật khẩu proxy trên kho công khai là chuyện xảy ra thường xuyên hơn anh em nghĩ.
Xoay proxy theo danh sách trong PHP cURL proxy
Khi gửi nhiều yêu cầu tới cùng một website, dùng một IP dễ bị giới hạn tần suất. Xoay qua nhiều proxy giúp chia tải.

Xoay proxy theo danh sách
Đọc danh sách proxy
Lưu proxy trong tệp văn bản mỗi dòng một proxy theo cùng định dạng, ví dụ host:port:user:matkhau. Đọc bằng file() với cờ bỏ dòng trống rồi tách từng phần bằng explode. Thống nhất một định dạng giúp tránh lỗi tách sai, các dạng phổ biến được liệt kê trong bài định dạng proxy.
Chọn proxy cho mỗi yêu cầu
<?php
$list = file('proxies.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
function fetch(string $url, string $line): string|false {
[$host, $port, $user, $pass] = explode(':', $line);
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_PROXY => "$host:$port",
CURLOPT_PROXYUSERPWD => "$user:$pass",
CURLOPT_CONNECTTIMEOUT => 8,
CURLOPT_TIMEOUT => 25,
]);
$res = curl_exec($ch);
curl_close($ch);
return $res;
}
foreach ($urls as $i => $url) {
$line = $list[$i % count($list)];
$html = fetch($url, $line);
}
Cách chia lần lượt (round robin) đơn giản và đều. Có thể thay bằng chọn ngẫu nhiên, nhưng ngẫu nhiên dễ dồn nhiều yêu cầu vào một proxy trong thời gian ngắn.
Bỏ proxy lỗi và thử lại
Khi một proxy trả lỗi kết nối hay thời gian chờ, đánh dấu tạm và chuyển sang proxy kế tiếp. Đếm số lần lỗi liên tiếp, quá ngưỡng thì loại khỏi danh sách trong lần chạy đó. Cơ chế dự phòng như vậy được bàn kỹ trong bài proxy failover.
Dùng proxy xoay thay cho danh sách
Proxy xoay chỉ có một địa chỉ, phía nhà cung cấp tự đổi IP theo thời gian hoặc theo mỗi yêu cầu. Mã PHP giữ nguyên một CURLOPT_PROXY, không cần quản lý danh sách. Khi cần đổi IP chủ động, có thể gọi API đổi IP của nhà cung cấp, cách làm có trong bài API đổi IP proxy xoay.
Chạy song song với curl_multi qua PHP cURL proxy
Gửi lần lượt từng yêu cầu rất chậm khi có hàng trăm địa chỉ. curl_multi cho phép chạy nhiều yêu cầu cùng lúc trong một tiến trình PHP.
Cách hoạt động
Tạo nhiều phiên cURL, mỗi phiên một proxy, thêm vào bộ curl_multi_init. Gọi curl_multi_exec trong vòng lặp tới khi tất cả xong, rồi lấy kết quả từng phiên bằng curl_multi_getcontent. Mỗi phiên giữ cấu hình proxy riêng, nên có thể gán mỗi yêu cầu một IP.
Giới hạn số luồng
Chạy quá nhiều yêu cầu cùng lúc qua một proxy dễ bị proxy hoặc website đích từ chối. Chia lô 10 đến 20 yêu cầu mỗi lượt, tuỳ gói proxy. Cách ước lượng số luồng phù hợp có trong bài 1 proxy chạy được bao nhiêu luồng.
Ghi lại proxy của từng phiên
Lưu ánh xạ phiên với proxy trong một mảng. Khi phiên lỗi, biết ngay proxy nào hỏng để loại hoặc báo nhà cung cấp. Thiếu bước này, lỗi trong curl_multi rất khó lần lại.
PHP cURL proxy trong Guzzle và Laravel
Phần lớn dự án PHP hiện đại không gọi cURL trực tiếp mà qua Guzzle hoặc HTTP client của framework. Bên dưới vẫn là cURL, nhưng cách khai báo proxy khác.
Guzzle
Guzzle có tuỳ chọn proxy trong mỗi yêu cầu hoặc khi tạo client. Giá trị có thể là chuỗi một proxy, hoặc mảng tách proxy theo giao thức kèm danh sách không dùng proxy. Tài liệu ở mục Request Options của Guzzle.
$client = new \GuzzleHttp\Client(['timeout' => 30]);
$res = $client->get('https://api.ipify.org', [
'proxy' => 'http://user:matkhau@103.x.x.x:8080',
]);
Lưu ý khi ghi tài khoản trong URL như trên, mật khẩu có ký tự đặc biệt phải mã hoá URL bằng rawurlencode trước khi ghép.
Laravel HTTP Client
Laravel bọc Guzzle trong facade Http. Truyền proxy qua withOptions, theo tài liệu HTTP Client của Laravel:
$res = Http::withOptions([
'proxy' => 'socks5h://user:matkhau@103.x.x.x:1080',
])->timeout(30)->get('https://api.ipify.org');
Có thể đặt cấu hình này trong một macro hoặc service để dùng chung, tránh lặp ở nhiều nơi.
Tuỳ chọn cURL thô trong Guzzle
Khi cần tuỳ chọn mà Guzzle không bọc sẵn, truyền mảng curl với các hằng CURLOPT như khi gọi cURL trực tiếp. Cách này hữu ích khi cần CURLOPT_PROXYAUTH cho proxy NTLM của công ty.
Đọc lỗi khi dùng PHP cURL proxy
Phần lớn thời gian gỡ lỗi proxy là đọc đúng thông báo. curl_errno và curl_error cho biết lỗi xảy ra ở giai đoạn nào.

Đọc lỗi cURL trong PHP
Mã lỗi |
Thông điệp thường gặp |
Nguyên nhân khả dĩ |
Cách sửa |
|---|---|---|---|
5 |
Could not resolve proxy |
Sai tên máy chủ proxy |
Kiểm tra lại host |
7 |
Failed to connect |
Proxy chết, sai cổng, tường lửa chặn |
Thử proxy bằng curl dòng lệnh |
28 |
Operation timed out |
Proxy chậm hoặc treo |
Tăng thời gian chờ, đổi proxy |
35 |
SSL connect error |
Lỗi bắt tay TLS qua đường hầm |
Kiểm tra phiên bản OpenSSL, đích |
56 |
Received HTTP code 407 from proxy after CONNECT |
Sai xác thực khi mở đường hầm |
Sửa tài khoản, whitelist |
97 |
Proxy handshake error |
Sai kiểu proxy, ví dụ SOCKS vào cổng HTTP |
Đổi CURLOPT_PROXYTYPE |
Bật chế độ verbose
Đặt CURLOPT_VERBOSE là true và CURLOPT_STDERR trỏ tới một tệp để ghi toàn bộ quá trình kết nối. Log cho thấy cURL kết nối tới proxy nào, gửi CONNECT ra sao, proxy trả mã gì. Đây là cách nhanh nhất để biết lỗi ở proxy hay ở website đích.
Phân biệt lỗi proxy và lỗi website đích
Nếu kết nối tới proxy thành công nhưng nhận mã 403, 429 từ website đích, proxy vẫn hoạt động, chỉ là IP bị đích chặn hoặc giới hạn. Đổi IP, giảm tần suất, sửa header cho giống trình duyệt thật. Mã 429 cụ thể được phân tích trong bài mua proxy bị lỗi 429.
Kiểm tra proxy độc lập với mã
Trước khi sửa mã, chạy lệnh curl -x với cùng proxy trên máy chủ. Nếu dòng lệnh cũng lỗi, vấn đề nằm ở proxy hoặc mạng máy chủ. Nếu dòng lệnh chạy được, vấn đề nằm trong cấu hình PHP.
Tối ưu PHP cURL proxy cho công việc thu thập dữ liệu
Cấu hình proxy đúng mới là phần đầu. Để công cụ chạy ổn định lâu dài, cần thêm vài điểm.
Header giống trình duyệt
Website đích đánh giá cả header, không chỉ IP. Đặt User-Agent của trình duyệt phổ biến, Accept-Language phù hợp với vùng IP. IP Việt Nam đi kèm Accept-Language tiếng Anh Mỹ là dấu hiệu lệch dễ bị chú ý. Vai trò của User-Agent được giải thích trong bài User-Agent là gì.
Giữ cookie theo proxy
Dùng CURLOPT_COOKIEJAR và CURLOPT_COOKIEFILE với mỗi proxy một tệp cookie. Website thấy một IP luôn đi kèm một bộ cookie nhất quán, giống người dùng thật. Trộn cookie giữa nhiều IP khiến phiên trông bất thường.
Giảm dung lượng tải về
Chỉ tải phần cần thiết. Gọi API trả JSON thay vì tải cả trang HTML khi có thể. Bật CURLOPT_ENCODING là chuỗi rỗng để nhận nội dung nén. Với proxy tính theo dung lượng, những tối ưu này giảm chi phí đáng kể.
Chọn loại proxy phù hợp
Website dễ tính chấp nhận IP datacenter, giá rẻ và nhanh. Website khó tính chặn dải IP datacenter, cần IP dân cư. Thị trường Việt Nam cần IP Việt Nam để thấy đúng giá và nội dung. Nếu cần IP Việt Nam theo nhà mạng cho công cụ PHP, anh em có thể mua proxy tại ProxyVN, mỗi proxy hỗ trợ cả HTTP và SOCKS5 nên dùng được với mọi kiểu cấu hình trong bài. Tổng quan về thu thập dữ liệu qua proxy có trong bài web scraping proxy là gì.
Kiểm tra proxy trước khi chạy PHP cURL proxy
Chạy công cụ với cả danh sách proxy mà không kiểm tra trước là cách nhanh nhất để mất thời gian. Một hàm kiểm tra ngắn chạy đầu mỗi lượt giúp loại proxy hỏng ngay từ đầu.
Hàm kiểm tra đơn giản
Hàm nhận một proxy, gửi yêu cầu tới dịch vụ trả về IP, đo thời gian và so IP trả về với IP của proxy. Nếu kết nối lỗi, quá thời gian chờ hoặc IP trả về là IP máy chủ, proxy bị đánh dấu không dùng được. Lấy thời gian bằng curl_getinfo với CURLINFO_TOTAL_TIME, không cần tự đo bằng microtime.
Các chỉ số nên ghi lại
- Thời gian kết nối tới proxy: CURLINFO_CONNECT_TIME cho biết proxy ở xa hay gần, có quá tải không.
- Thời gian tới byte đầu tiên: CURLINFO_STARTTRANSFER_TIME phản ánh cả proxy và website đích.
- Mã phản hồi: CURLINFO_HTTP_CODE để phân biệt proxy chạy nhưng bị đích chặn.
- IP ra thực tế: để biết proxy xoay đã đổi IP chưa, hoặc proxy có đang trả IP khác với cam kết không.
Chạy kiểm tra theo lịch
Với công cụ chạy liên tục, kiểm tra cả danh sách mỗi giờ bằng cron và lưu kết quả vào cơ sở dữ liệu. Công cụ chính chỉ lấy proxy đang ở trạng thái tốt. Cách đánh giá chất lượng proxy theo tỷ lệ thành công được giải thích trong bài proxy success rate.
PHP cURL proxy và chứng chỉ SSL
Lỗi chứng chỉ là nhóm lỗi thứ hai hay gặp sau lỗi xác thực. Cách xử lý sai ở đây có thể làm lộ dữ liệu.
Đừng tắt kiểm tra chứng chỉ
Nhiều đoạn mã trên mạng đặt CURLOPT_SSL_VERIFYPEER là false để "chữa" lỗi chứng chỉ. Làm vậy khiến cURL chấp nhận mọi chứng chỉ, kể cả chứng chỉ giả do bên trung gian đưa ra. Nếu proxy không đáng tin, nó có thể đọc và sửa toàn bộ dữ liệu. Chỉ tắt kiểm tra trong môi trường thử nghiệm với máy chủ nội bộ.
Cập nhật kho chứng chỉ gốc
Lỗi "unable to get local issuer certificate" trên Windows hay máy chủ cũ thường do PHP không tìm thấy kho chứng chỉ gốc. Tải tệp cacert.pem mới, khai báo trong php.ini ở mục curl.cainfo hoặc đặt CURLOPT_CAINFO trong mã. Cách này sửa tận gốc thay vì tắt kiểm tra.
Proxy công ty giải mã HTTPS
Một số mạng công ty dùng proxy giải mã HTTPS, đưa ra chứng chỉ do công ty ký. Cần thêm chứng chỉ gốc của công ty vào kho chứng chỉ mà PHP dùng. Hỏi bộ phận IT tệp chứng chỉ thay vì tắt kiểm tra cho cả ứng dụng.
Proxy HTTPS
libcurl bản mới hỗ trợ kết nối tới chính proxy bằng TLS, khai báo bằng tiền tố https:// trong CURLOPT_PROXY hoặc kiểu CURLPROXY_HTTPS. Loại proxy này ít gặp ở dịch vụ bán lẻ, phần lớn proxy dùng HTTP thường để kết nối tới proxy và mã hoá ở đường hầm phía sau. Nếu ghi https:// cho proxy HTTP thường, kết nối sẽ lỗi bắt tay.
Biến môi trường và PHP cURL proxy
libcurl đọc biến môi trường http_proxy, https_proxy và no_proxy khi không có CURLOPT_PROXY. Điều này có thể vừa tiện vừa gây bất ngờ.
Khi chạy bằng dòng lệnh
Script PHP chạy bằng lệnh php trong terminal kế thừa biến môi trường của shell. Nếu shell đã đặt https_proxy, mọi yêu cầu cURL không khai báo proxy sẽ tự đi qua proxy đó. Đây là nguyên nhân của nhiều tình huống "không cài proxy mà vẫn ra IP lạ".
Khi chạy qua máy chủ web
PHP chạy dưới PHP-FPM hay Apache thường không có biến này, trừ khi cấu hình dịch vụ đặt vào. Vì vậy cùng một script có thể chạy khác nhau giữa dòng lệnh và trình duyệt. Muốn hành vi nhất quán, khai báo proxy rõ ràng trong mã thay vì dựa vào biến môi trường.
Tắt proxy cho một yêu cầu
Đặt CURLOPT_PROXY là chuỗi rỗng để yêu cầu đi thẳng, bỏ qua biến môi trường. Hoặc dùng CURLOPT_NOPROXY với dấu sao để bỏ proxy cho mọi tên miền. Cách viết danh sách ngoại lệ được giải thích trong bài NO_PROXY là gì.
So sánh PHP cURL proxy với ngôn ngữ khác
Nếu anh em làm việc với nhiều ngôn ngữ, bảng dưới giúp đối chiếu cách khai báo proxy.
Ngôn ngữ |
Thư viện |
Cách khai báo proxy |
|---|---|---|
PHP |
cURL, Guzzle |
CURLOPT_PROXY, tuỳ chọn proxy |
Python |
requests |
Tham số proxies |
Go |
net/http |
Transport.Proxy |
C# |
HttpClient |
HttpClientHandler.Proxy |
Java |
HttpClient |
ProxySelector |
Hướng dẫn chi tiết cho từng ngôn ngữ có trong các bài Python requests proxy, Golang proxy, C# HttpClient proxy và Java proxy.
Câu hỏi thường gặp về PHP cURL proxy
file_get_contents có dùng proxy được không
Có, qua stream context với tuỳ chọn proxy và request_fulluri. Tuy vậy file_get_contents không hỗ trợ SOCKS5 và khó xử lý lỗi, nên cURL hoặc Guzzle là lựa chọn tốt hơn cho công việc nghiêm túc.
Vì sao chạy ở máy cá nhân được mà lên máy chủ thì lỗi
Thường do máy chủ có IP khác chưa được thêm vào whitelist, tường lửa máy chủ chặn cổng proxy, hoặc libcurl trên máy chủ cũ hơn. Kiểm tra curl_version() và thử curl dòng lệnh trên máy chủ.
Có cần đặt CURLOPT_HTTPPROXYTUNNEL không
Với địa chỉ HTTPS, cURL tự mở đường hầm, không cần đặt. Chỉ cần khi muốn ép cả yêu cầu HTTP thường đi qua đường hầm, trường hợp này ít gặp.
Mật khẩu proxy có ký tự đặc biệt thì làm sao
Dùng CURLOPT_PROXYUSERPWD thì không cần mã hoá, trừ dấu hai chấm. Khi ghi trong URL proxy, như với Guzzle, mã hoá bằng rawurlencode cho cả tài khoản và mật khẩu.
Dùng proxy miễn phí cho PHP cURL được không
Về kỹ thuật thì được, cấu hình giống hệt proxy trả phí. Nhưng proxy miễn phí thường chết sau vài giờ, chậm, bị nhiều website chặn sẵn, và có thể đọc dữ liệu đi qua nếu anh em gửi qua HTTP thường. Với công cụ chạy thật, tỷ lệ lỗi cao làm mã phải xử lý thử lại liên tục, tốn công hơn tiền tiết kiệm được. Rủi ro cụ thể được phân tích trong bài proxy miễn phí có an toàn không.
Làm sao biết yêu cầu thật sự đi qua proxy
Gọi một dịch vụ trả về IP như api.ipify.org và so với IP máy chủ. Hoặc bật CURLOPT_VERBOSE, log sẽ ghi dòng kết nối tới địa chỉ proxy thay vì địa chỉ website đích. Nên làm bước này mỗi khi đổi cấu hình, vì biến môi trường hay tuỳ chọn mặc định của framework có thể đè lên cấu hình anh em nghĩ là đang dùng.
Tổng kết
PHP cURL proxy chỉ cần vài tuỳ chọn: CURLOPT_PROXY, CURLOPT_PROXYTYPE, CURLOPT_PROXYUSERPWD và thời gian chờ. Chọn SOCKS5_HOSTNAME khi cần ẩn truy vấn DNS, xoay proxy theo danh sách khi gửi nhiều yêu cầu, bật verbose khi gỡ lỗi và luôn tách thông tin proxy khỏi mã nguồn. Cần proxy Việt Nam ổn định cho dự án PHP, anh em liên hệ Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam để được tư vấn.