Trang chủ
Các bài mới
Latest activity
Biên tập viên
Diễn Đàn
Bài viết mới
Tìm kiếm diễn đàn
Tin Mới
Bài viết mới
New resources
Bài đăng tiểu sử mới
Hoạt động mới nhất
Resources
Latest reviews
Search resources
Thành Viên
Khách truy cập hiện tại
Bài mới trên trang cá nhân
Tìm kiếm bài đăng trong trang cá nhân
Tool
SMTool - Công cụ đăng bài tự động Facebook
50 SEO Tools
Photoshop online
Facebook Video Down
Cầu nguyện Genshin
Biolink
Genshin map
Đăng nhập
Đăng ký
Mới
Tìm kiếm
Tìm kiếm
Chỉ tìm trong tiêu đề
bởi:
Bài viết mới
Tìm kiếm diễn đàn
Menu
Đăng nhập
Đăng ký
Install the app
Install
28/06 cập nhật đăng ký đăng nhập qua Google & Facebook
Diễn Đàn
Thủ thuật
Thủ thuật internet
Ubuntu 22.04: curl 7.81 làm chết request HTTP/2 khi gửi song song >100 – cách nâng curl 8.x cho PHP-FPM (không đụng hệ thống)
JavaScript is disabled. For a better experience, please enable JavaScript in your browser before proceeding.
You are using an out of date browser. It may not display this or other websites correctly.
You should upgrade or use an
alternative browser
.
Reply to thread
Nội dung
<blockquote data-quote="TenHoshi" data-source="post: 33032" data-attributes="member: 1"><p><strong>Triệu chứng:</strong> PHP dùng [ICODE]curl_multi[/ICODE] + HTTP/2 (gửi FCM, gọi API song song…) trên Ubuntu 22.04. Bắn lô hơn 100 request cùng lúc thì chỉ khoảng 100 cái thành công, phần còn lại trả [ICODE]HTTP 0[/ICODE], [ICODE]curl_error[/ICODE] rỗng, mỗi lô treo 11–15 giây. Chạy vài phút sau thì lại nhanh, nên rất khó bắt bệnh.</p><p></p><p><strong>Nguyên nhân:</strong> Ubuntu 22.04 đi kèm <strong>curl 7.81.0</strong>. Server HTTP/2 (vd. Google) chỉ cho khoảng 100 stream trên mỗi kết nối. Khi kết nối đã đầy, curl 7.81 mở một kết nối riêng cho <u>từng</u> request dư, và các kết nối này chết hàng loạt. Chạy cùng script với curl 8.x thì không bị.</p><p></p><p>Kết quả test thực tế, cùng VPS, cùng PHP 8.3, lô 300 request:</p><p>[CODE]</p><p>curl 7.81.0</p><p>round 1: 11.1s codes={"400":100,"0":200} conns=201</p><p>round 2: 11.0s codes={"400":100,"0":200} conns=201</p><p>curl 8.11.1</p><p>round 1: 0.3s codes={"400":300} conns=3</p><p>round 2: 0.1s codes={"400":300} conns=3</p><p>[/CODE]</p><p>(Mã 400 là đúng vì test dùng token giả. Lỗi thật là mã 0.)</p><p></p><hr /><p><span style="font-size: 18px"><strong>1. Kiểm tra VPS có bị không</strong></span></p><p>[CODE=bash]</p><p>head -2 /etc/os-release; curl --version | head -1</p><p>PHP=/www/server/php/83/bin/php # đổi theo bản PHP của bạn (aaPanel). Không dùng aaPanel: PHP=$(which php)</p><p>$PHP -r 'echo curl_version()["version"], "\n";'</p><p>ldd $PHP | grep -Ei 'curl|ssl|nghttp2'</p><p>[/CODE]</p><p>Nếu PHP báo [ICODE]7.x[/ICODE] và [ICODE]ldd[/ICODE] trỏ tới [ICODE]/lib/x86_64-linux-gnu/libcurl.so.4[/ICODE] (PHP dùng libcurl của hệ thống) thì làm theo cách bên dưới được.</p><p></p><p><span style="font-size: 18px"><strong>2. Các cách xử lý – ưu / nhược</strong></span></p><p><strong>A. Giữ curl cũ, chỉ chạy tối đa 100 request song song mỗi lô</strong></p><ul> <li data-xf-list-type="ul">Ưu: không đụng gì tới server, sửa 1 hằng số trong code.</li> <li data-xf-list-type="ul">Nhược: chậm hơn (lô nhỏ, nhiều vòng); vẫn dễ dính lại nếu chỗ khác trong code bắn song song nhiều.</li> </ul><p><strong>B. Build curl 8.x vào /opt, chỉ cho php-fpm dùng qua LD_LIBRARY_PATH (cách mình đang dùng)</strong></p><ul> <li data-xf-list-type="ul">Ưu: không thay curl/libcurl của hệ thống → apt, git, các dịch vụ khác không bị ảnh hưởng.</li> <li data-xf-list-type="ul">Ưu: hoàn tác chỉ bằng xoá 1 dòng + restart; làm xong trong khoảng 10 phút, không downtime (php-fpm restart graceful).</li> <li data-xf-list-type="ul">Nhược: tự build nên phải tự theo dõi và cập nhật bản vá bảo mật của curl.</li> <li data-xf-list-type="ul">Nhược: cập nhật/cài lại PHP qua aaPanel có thể ghi đè file init → mất curl mới, phải thêm lại dòng.</li> <li data-xf-list-type="ul">Nhược: PHP CLI (cron chạy lệnh [ICODE]php file.php[/ICODE]) vẫn dùng bản cũ, trừ khi thêm LD_LIBRARY_PATH vào lệnh cron.</li> </ul><p><strong>C. Cài curl 8.x vào /usr/local/lib để thay libcurl cho toàn hệ thống</strong></p><ul> <li data-xf-list-type="ul">Ưu: mọi thứ (CLI, php-fpm, mọi bản PHP) đều dùng bản mới, không cần sửa init.</li> <li data-xf-list-type="ul">Nhược: ảnh hưởng tất cả chương trình dùng libcurl (apt, git…), lỗi là lỗi cả server; khó hoàn tác sạch.</li> </ul><p><strong>D. Nâng Ubuntu lên 24.04 (curl 8.5 từ apt)</strong></p><ul> <li data-xf-list-type="ul">Ưu: bản chính thống, được Ubuntu vá bảo mật tự động.</li> <li data-xf-list-type="ul">Nhược: phải nâng cả hệ điều hành, có downtime, rủi ro vỡ aaPanel/PHP/extension; với VPS đang chạy thật thì nặng nhất.</li> <li data-xf-list-type="ul">Lưu ý: mình chưa test trực tiếp lỗi này trên 8.5, nên chạy lại bài test ở mục 5 sau khi nâng.</li> </ul><p><strong>E. Biên dịch lại PHP với curl mới</strong></p><ul> <li data-xf-list-type="ul">Ưu: sạch nhất, không cần biến môi trường.</li> <li data-xf-list-type="ul">Nhược: tốn công nhất; aaPanel cập nhật PHP là build đè mất.</li> </ul><p></p><p><span style="font-size: 18px"><strong>3. Chọn bản curl nào – ưu / nhược</strong></span></p><ul> <li data-xf-list-type="ul"><strong>7.81.0</strong> (mặc định Ubuntu 22.04): Ubuntu vá bảo mật tự động. Nhược: dính lỗi HTTP/2 ở trên khi bắn hơn 100 request song song.</li> <li data-xf-list-type="ul"><strong>8.5.0</strong> (mặc định Ubuntu 24.04): cài bằng apt, được vá tự động. Nhược: phải lên Ubuntu 24.04, không cài được trên 22.04 bằng apt.</li> <li data-xf-list-type="ul"><strong>8.11.1</strong> (bản mình build, đã test lô 300 qua): chạy được với OpenSSL 3.0.2 + nghttp2 1.43 có sẵn trên 22.04, không cần cài thêm thư viện lạ. Nhược: tự build, tự vá.</li> <li data-xf-list-type="ul"><strong>Bản 8.x mới nhất</strong>: nhiều sửa lỗi nhất. Nhược: có thể đòi thư viện mới hơn bản có sẵn của 22.04 — nếu [ICODE]./configure[/ICODE] báo thiếu thì cài thêm hoặc lùi về 8.11.1.</li> </ul><p></p><hr /><p><span style="font-size: 18px"><strong>4. Làm theo cách B (từng bước)</strong></span></p><p><strong>Bước 1 – Build curl vào /opt/curl8</strong> (không ảnh hưởng gì đang chạy):</p><p>[CODE=bash]</p><p>apt-get install -y build-essential libssl-dev libnghttp2-dev zlib1g-dev</p><p>cd /usr/local/src && wget https://curl.se/download/curl-8.11.1.tar.gz && tar xzf curl-8.11.1.tar.gz && cd curl-8.11.1</p><p>./configure --prefix=/opt/curl8 --with-openssl --with-nghttp2 --without-libpsl \</p><p> --enable-shared --disable-static --enable-versioned-symbols</p><p>make -j"$(nproc)" && make install</p><p>/opt/curl8/bin/curl --version | head -1 # curl 8.11.1 ... nghttp2/...</p><p>[/CODE]</p><p>[ICODE]--enable-versioned-symbols[/ICODE] để PHP không in cảnh báo "no version information available" lúc khởi động (thiếu cũng chạy được, chỉ là log bẩn).</p><p></p><p><strong>Bước 2 – Thử bằng CLI trước</strong> (chưa đụng web):</p><p>[CODE=bash]</p><p>LD_LIBRARY_PATH=/opt/curl8/lib $PHP -r 'echo curl_version()["version"], "\n";' # → 8.11.1</p><p>[/CODE]</p><p>Rồi chạy bài test ở mục 5 với cả bản cũ và bản mới để so sánh.</p><p></p><p><strong>Bước 3 – Áp cho php-fpm</strong> (aaPanel, ví dụ PHP 8.3 → file init [ICODE]/etc/init.d/php-fpm-83[/ICODE]):</p><p>[CODE=bash]</p><p>F=/etc/init.d/php-fpm-83</p><p>grep -n 'LD_LIBRARY_PATH' $F || sed -i '2i export LD_LIBRARY_PATH=/opt/curl8/lib' $F</p><p>$F restart</p><p>for p in $(pgrep -f 'php-fpm: master'); do echo "$p $(grep -q curl8 /proc/$p/maps && echo curl8 OK || echo CHUA) $(tr '\0' ' ' </proc/$p/cmdline)"; done</p><p>[/CODE]</p><p>Dòng master của bản PHP vừa sửa phải báo [ICODE]curl8 OK[/ICODE]. Master của bản PHP khác (vd. 8.1) báo CHUA là bình thường. Không dùng aaPanel mà chạy systemd thì thêm [ICODE]Environment=LD_LIBRARY_PATH=/opt/curl8/lib[/ICODE] bằng [ICODE]systemctl edit php8.3-fpm[/ICODE].</p><p></p><p>Kiểm tra qua web (tạo file tạm rồi xoá ngay):</p><p>[CODE=bash]</p><p>echo '<?php echo curl_version()["version"];' > /www/wwwroot/TEN_SITE/_cv.php</p><p>curl -s https://TEN_SITE/_cv.php; echo; rm -f /www/wwwroot/TEN_SITE/_cv.php # → 8.11.1</p><p>[/CODE]</p><p></p><p><strong>Hoàn tác:</strong></p><p>[CODE=bash]</p><p>sed -i '/LD_LIBRARY_PATH=\/opt\/curl8/d' /etc/init.d/php-fpm-83 && /etc/init.d/php-fpm-83 restart</p><p>[/CODE]</p><p></p><p><span style="font-size: 18px"><strong>5. Script test (lô N request HTTP/2 song song)</strong></span></p><p>Script dưới đây gửi request [ICODE]validate_only[/ICODE] tới FCM với token giả. FCM chỉ kiểm tra rồi trả 400, không có thông báo nào gửi tới máy thật. Tham số đầu là đường dẫn file service account JSON của Firebase.</p><p>[CODE=php]</p><p><?php</p><p>$sa=json_decode(file_get_contents($argv[1]),true); $N=(int)($argv[2]??300); $rounds=(int)($argv[3]??3);</p><p>$b64=fn($s)=>rtrim(strtr(base64_encode($s),'+/','-_'),'=');</p><p>$now=time(); $h=$b64(json_encode(['alg'=>'RS256','typ'=>'JWT']));</p><p>$c=$b64(json_encode(['iss'=>$sa['client_email'],'scope'=>'https://www.googleapis.com/auth/firebase.messaging','aud'=>'https://oauth2.googleapis.com/token','iat'=>$now,'exp'=>$now+3600]));</p><p>openssl_sign("$h.$c",$sig,$sa['private_key'],'SHA256');</p><p>$ch=curl_init('https://oauth2.googleapis.com/token');curl_setopt_array($ch,[CURLOPT_POST=>1,CURLOPT_RETURNTRANSFER=>1,CURLOPT_POSTFIELDS=>http_build_query(['grant_type'=>'urn:ietf:params:oauth:grant-type:jwt-bearer','assertion'=>"$h.$c.".$b64($sig)])]);</p><p>$tok=json_decode(curl_exec($ch),true)['access_token']??''; if(!$tok) exit("no token\n");</p><p>$url='https://fcm.googleapis.com/v1/projects/'.$sa['project_id'].'/messages:send';</p><p>echo 'curl ', curl_version()['version'], "\n";</p><p>$mh=curl_multi_init(); curl_multi_setopt($mh,CURLMOPT_PIPELINING,CURLPIPE_MULTIPLEX);</p><p>for($r=1;$r<=$rounds;$r++){</p><p> $hs=[];$t0=microtime(true);</p><p> for($i=0;$i<$N;$i++){ $c=curl_init($url); curl_setopt_array($c,[CURLOPT_POST=>1,CURLOPT_POSTFIELDS=>json_encode(['validate_only'=>true,'message'=>['token'=>'fake'.$i,'data'=>['a'=>'b']]]),</p><p> CURLOPT_HTTPHEADER=>["Authorization: Bearer $tok",'Content-Type: application/json'],CURLOPT_RETURNTRANSFER=>1,CURLOPT_TIMEOUT=>15,CURLOPT_CONNECTTIMEOUT=>10,</p><p> CURLOPT_HTTP_VERSION=>CURL_HTTP_VERSION_2TLS,CURLOPT_PIPEWAIT=>true]); curl_multi_add_handle($mh,$c); $hs[]=$c; }</p><p> do{$st=curl_multi_exec($mh,$run); if($run) curl_multi_select($mh);}while($run>0&&$st===CURLM_OK);</p><p> $codes=[];$errs=[];$conn=[];</p><p> foreach($hs as $c){$k=curl_getinfo($c,CURLINFO_HTTP_CODE);$codes[$k]=($codes[$k]??0)+1; if($k==0){$e=curl_error($c);$errs[$e]=($errs[$e]??0)+1;}</p><p> $conn[curl_getinfo($c,CURLINFO_LOCAL_PORT)]=1; curl_multi_remove_handle($mh,$c);}</p><p> printf("round %d: %.1fs codes=%s conns=%d errs=%s\n",$r,microtime(true)-$t0,json_encode($codes),count($conn),json_encode($errs));</p><p>}</p><p>[/CODE]</p><p>[CODE=bash]</p><p>echo "== curl cũ =="; $PHP /root/h2test.php /duong-dan/service-account.json 300 3 2>/dev/null</p><p>echo "== curl mới =="; LD_LIBRARY_PATH=/opt/curl8/lib $PHP /root/h2test.php /duong-dan/service-account.json 300 3 2>/dev/null</p><p>[/CODE]</p><p><strong>Đạt:</strong> bản mới cả 3 round [ICODE]codes={"400":300}[/ICODE], không có mã 0, [ICODE]conns[/ICODE] chỉ vài cái.</p><p></p><p><span style="font-size: 18px"><strong>6. Lưu ý sau khi làm</strong></span></p><ul> <li data-xf-list-type="ul">Mỗi lần cập nhật PHP qua aaPanel: kiểm tra lại bằng file [ICODE]_cv.php[/ICODE], ra 7.81 thì chạy lại bước 3.</li> <li data-xf-list-type="ul">Theo dõi tin bảo mật của curl (curl.se/docs/security.html); có bản vá thì build lại bản mới vào /opt/curl8 rồi restart php-fpm.</li> <li data-xf-list-type="ul">Muốn tăng lô song song lên trên 100 thì nên đợi chạy thật ổn định một đợt rồi mới tăng.</li> </ul></blockquote><p></p>
[QUOTE="TenHoshi, post: 33032, member: 1"] [B]Triệu chứng:[/B] PHP dùng [ICODE]curl_multi[/ICODE] + HTTP/2 (gửi FCM, gọi API song song…) trên Ubuntu 22.04. Bắn lô hơn 100 request cùng lúc thì chỉ khoảng 100 cái thành công, phần còn lại trả [ICODE]HTTP 0[/ICODE], [ICODE]curl_error[/ICODE] rỗng, mỗi lô treo 11–15 giây. Chạy vài phút sau thì lại nhanh, nên rất khó bắt bệnh. [B]Nguyên nhân:[/B] Ubuntu 22.04 đi kèm [B]curl 7.81.0[/B]. Server HTTP/2 (vd. Google) chỉ cho khoảng 100 stream trên mỗi kết nối. Khi kết nối đã đầy, curl 7.81 mở một kết nối riêng cho [U]từng[/U] request dư, và các kết nối này chết hàng loạt. Chạy cùng script với curl 8.x thì không bị. Kết quả test thực tế, cùng VPS, cùng PHP 8.3, lô 300 request: [CODE] curl 7.81.0 round 1: 11.1s codes={"400":100,"0":200} conns=201 round 2: 11.0s codes={"400":100,"0":200} conns=201 curl 8.11.1 round 1: 0.3s codes={"400":300} conns=3 round 2: 0.1s codes={"400":300} conns=3 [/CODE] (Mã 400 là đúng vì test dùng token giả. Lỗi thật là mã 0.) [HR][/HR] [SIZE=5][B]1. Kiểm tra VPS có bị không[/B][/SIZE] [CODE=bash] head -2 /etc/os-release; curl --version | head -1 PHP=/www/server/php/83/bin/php # đổi theo bản PHP của bạn (aaPanel). Không dùng aaPanel: PHP=$(which php) $PHP -r 'echo curl_version()["version"], "\n";' ldd $PHP | grep -Ei 'curl|ssl|nghttp2' [/CODE] Nếu PHP báo [ICODE]7.x[/ICODE] và [ICODE]ldd[/ICODE] trỏ tới [ICODE]/lib/x86_64-linux-gnu/libcurl.so.4[/ICODE] (PHP dùng libcurl của hệ thống) thì làm theo cách bên dưới được. [SIZE=5][B]2. Các cách xử lý – ưu / nhược[/B][/SIZE] [B]A. Giữ curl cũ, chỉ chạy tối đa 100 request song song mỗi lô[/B] [LIST] [*]Ưu: không đụng gì tới server, sửa 1 hằng số trong code. [*]Nhược: chậm hơn (lô nhỏ, nhiều vòng); vẫn dễ dính lại nếu chỗ khác trong code bắn song song nhiều. [/LIST] [B]B. Build curl 8.x vào /opt, chỉ cho php-fpm dùng qua LD_LIBRARY_PATH (cách mình đang dùng)[/B] [LIST] [*]Ưu: không thay curl/libcurl của hệ thống → apt, git, các dịch vụ khác không bị ảnh hưởng. [*]Ưu: hoàn tác chỉ bằng xoá 1 dòng + restart; làm xong trong khoảng 10 phút, không downtime (php-fpm restart graceful). [*]Nhược: tự build nên phải tự theo dõi và cập nhật bản vá bảo mật của curl. [*]Nhược: cập nhật/cài lại PHP qua aaPanel có thể ghi đè file init → mất curl mới, phải thêm lại dòng. [*]Nhược: PHP CLI (cron chạy lệnh [ICODE]php file.php[/ICODE]) vẫn dùng bản cũ, trừ khi thêm LD_LIBRARY_PATH vào lệnh cron. [/LIST] [B]C. Cài curl 8.x vào /usr/local/lib để thay libcurl cho toàn hệ thống[/B] [LIST] [*]Ưu: mọi thứ (CLI, php-fpm, mọi bản PHP) đều dùng bản mới, không cần sửa init. [*]Nhược: ảnh hưởng tất cả chương trình dùng libcurl (apt, git…), lỗi là lỗi cả server; khó hoàn tác sạch. [/LIST] [B]D. Nâng Ubuntu lên 24.04 (curl 8.5 từ apt)[/B] [LIST] [*]Ưu: bản chính thống, được Ubuntu vá bảo mật tự động. [*]Nhược: phải nâng cả hệ điều hành, có downtime, rủi ro vỡ aaPanel/PHP/extension; với VPS đang chạy thật thì nặng nhất. [*]Lưu ý: mình chưa test trực tiếp lỗi này trên 8.5, nên chạy lại bài test ở mục 5 sau khi nâng. [/LIST] [B]E. Biên dịch lại PHP với curl mới[/B] [LIST] [*]Ưu: sạch nhất, không cần biến môi trường. [*]Nhược: tốn công nhất; aaPanel cập nhật PHP là build đè mất. [/LIST] [SIZE=5][B]3. Chọn bản curl nào – ưu / nhược[/B][/SIZE] [LIST] [*][B]7.81.0[/B] (mặc định Ubuntu 22.04): Ubuntu vá bảo mật tự động. Nhược: dính lỗi HTTP/2 ở trên khi bắn hơn 100 request song song. [*][B]8.5.0[/B] (mặc định Ubuntu 24.04): cài bằng apt, được vá tự động. Nhược: phải lên Ubuntu 24.04, không cài được trên 22.04 bằng apt. [*][B]8.11.1[/B] (bản mình build, đã test lô 300 qua): chạy được với OpenSSL 3.0.2 + nghttp2 1.43 có sẵn trên 22.04, không cần cài thêm thư viện lạ. Nhược: tự build, tự vá. [*][B]Bản 8.x mới nhất[/B]: nhiều sửa lỗi nhất. Nhược: có thể đòi thư viện mới hơn bản có sẵn của 22.04 — nếu [ICODE]./configure[/ICODE] báo thiếu thì cài thêm hoặc lùi về 8.11.1. [/LIST] [HR][/HR] [SIZE=5][B]4. Làm theo cách B (từng bước)[/B][/SIZE] [B]Bước 1 – Build curl vào /opt/curl8[/B] (không ảnh hưởng gì đang chạy): [CODE=bash] apt-get install -y build-essential libssl-dev libnghttp2-dev zlib1g-dev cd /usr/local/src && wget https://curl.se/download/curl-8.11.1.tar.gz && tar xzf curl-8.11.1.tar.gz && cd curl-8.11.1 ./configure --prefix=/opt/curl8 --with-openssl --with-nghttp2 --without-libpsl \ --enable-shared --disable-static --enable-versioned-symbols make -j"$(nproc)" && make install /opt/curl8/bin/curl --version | head -1 # curl 8.11.1 ... nghttp2/... [/CODE] [ICODE]--enable-versioned-symbols[/ICODE] để PHP không in cảnh báo "no version information available" lúc khởi động (thiếu cũng chạy được, chỉ là log bẩn). [B]Bước 2 – Thử bằng CLI trước[/B] (chưa đụng web): [CODE=bash] LD_LIBRARY_PATH=/opt/curl8/lib $PHP -r 'echo curl_version()["version"], "\n";' # → 8.11.1 [/CODE] Rồi chạy bài test ở mục 5 với cả bản cũ và bản mới để so sánh. [B]Bước 3 – Áp cho php-fpm[/B] (aaPanel, ví dụ PHP 8.3 → file init [ICODE]/etc/init.d/php-fpm-83[/ICODE]): [CODE=bash] F=/etc/init.d/php-fpm-83 grep -n 'LD_LIBRARY_PATH' $F || sed -i '2i export LD_LIBRARY_PATH=/opt/curl8/lib' $F $F restart for p in $(pgrep -f 'php-fpm: master'); do echo "$p $(grep -q curl8 /proc/$p/maps && echo curl8 OK || echo CHUA) $(tr '\0' ' ' </proc/$p/cmdline)"; done [/CODE] Dòng master của bản PHP vừa sửa phải báo [ICODE]curl8 OK[/ICODE]. Master của bản PHP khác (vd. 8.1) báo CHUA là bình thường. Không dùng aaPanel mà chạy systemd thì thêm [ICODE]Environment=LD_LIBRARY_PATH=/opt/curl8/lib[/ICODE] bằng [ICODE]systemctl edit php8.3-fpm[/ICODE]. Kiểm tra qua web (tạo file tạm rồi xoá ngay): [CODE=bash] echo '<?php echo curl_version()["version"];' > /www/wwwroot/TEN_SITE/_cv.php curl -s https://TEN_SITE/_cv.php; echo; rm -f /www/wwwroot/TEN_SITE/_cv.php # → 8.11.1 [/CODE] [B]Hoàn tác:[/B] [CODE=bash] sed -i '/LD_LIBRARY_PATH=\/opt\/curl8/d' /etc/init.d/php-fpm-83 && /etc/init.d/php-fpm-83 restart [/CODE] [SIZE=5][B]5. Script test (lô N request HTTP/2 song song)[/B][/SIZE] Script dưới đây gửi request [ICODE]validate_only[/ICODE] tới FCM với token giả. FCM chỉ kiểm tra rồi trả 400, không có thông báo nào gửi tới máy thật. Tham số đầu là đường dẫn file service account JSON của Firebase. [CODE=php] <?php $sa=json_decode(file_get_contents($argv[1]),true); $N=(int)($argv[2]??300); $rounds=(int)($argv[3]??3); $b64=fn($s)=>rtrim(strtr(base64_encode($s),'+/','-_'),'='); $now=time(); $h=$b64(json_encode(['alg'=>'RS256','typ'=>'JWT'])); $c=$b64(json_encode(['iss'=>$sa['client_email'],'scope'=>'https://www.googleapis.com/auth/firebase.messaging','aud'=>'https://oauth2.googleapis.com/token','iat'=>$now,'exp'=>$now+3600])); openssl_sign("$h.$c",$sig,$sa['private_key'],'SHA256'); $ch=curl_init('https://oauth2.googleapis.com/token');curl_setopt_array($ch,[CURLOPT_POST=>1,CURLOPT_RETURNTRANSFER=>1,CURLOPT_POSTFIELDS=>http_build_query(['grant_type'=>'urn:ietf:params:oauth:grant-type:jwt-bearer','assertion'=>"$h.$c.".$b64($sig)])]); $tok=json_decode(curl_exec($ch),true)['access_token']??''; if(!$tok) exit("no token\n"); $url='https://fcm.googleapis.com/v1/projects/'.$sa['project_id'].'/messages:send'; echo 'curl ', curl_version()['version'], "\n"; $mh=curl_multi_init(); curl_multi_setopt($mh,CURLMOPT_PIPELINING,CURLPIPE_MULTIPLEX); for($r=1;$r<=$rounds;$r++){ $hs=[];$t0=microtime(true); for($i=0;$i<$N;$i++){ $c=curl_init($url); curl_setopt_array($c,[CURLOPT_POST=>1,CURLOPT_POSTFIELDS=>json_encode(['validate_only'=>true,'message'=>['token'=>'fake'.$i,'data'=>['a'=>'b']]]), CURLOPT_HTTPHEADER=>["Authorization: Bearer $tok",'Content-Type: application/json'],CURLOPT_RETURNTRANSFER=>1,CURLOPT_TIMEOUT=>15,CURLOPT_CONNECTTIMEOUT=>10, CURLOPT_HTTP_VERSION=>CURL_HTTP_VERSION_2TLS,CURLOPT_PIPEWAIT=>true]); curl_multi_add_handle($mh,$c); $hs[]=$c; } do{$st=curl_multi_exec($mh,$run); if($run) curl_multi_select($mh);}while($run>0&&$st===CURLM_OK); $codes=[];$errs=[];$conn=[]; foreach($hs as $c){$k=curl_getinfo($c,CURLINFO_HTTP_CODE);$codes[$k]=($codes[$k]??0)+1; if($k==0){$e=curl_error($c);$errs[$e]=($errs[$e]??0)+1;} $conn[curl_getinfo($c,CURLINFO_LOCAL_PORT)]=1; curl_multi_remove_handle($mh,$c);} printf("round %d: %.1fs codes=%s conns=%d errs=%s\n",$r,microtime(true)-$t0,json_encode($codes),count($conn),json_encode($errs)); } [/CODE] [CODE=bash] echo "== curl cũ =="; $PHP /root/h2test.php /duong-dan/service-account.json 300 3 2>/dev/null echo "== curl mới =="; LD_LIBRARY_PATH=/opt/curl8/lib $PHP /root/h2test.php /duong-dan/service-account.json 300 3 2>/dev/null [/CODE] [B]Đạt:[/B] bản mới cả 3 round [ICODE]codes={"400":300}[/ICODE], không có mã 0, [ICODE]conns[/ICODE] chỉ vài cái. [SIZE=5][B]6. Lưu ý sau khi làm[/B][/SIZE] [LIST] [*]Mỗi lần cập nhật PHP qua aaPanel: kiểm tra lại bằng file [ICODE]_cv.php[/ICODE], ra 7.81 thì chạy lại bước 3. [*]Theo dõi tin bảo mật của curl (curl.se/docs/security.html); có bản vá thì build lại bản mới vào /opt/curl8 rồi restart php-fpm. [*]Muốn tăng lô song song lên trên 100 thì nên đợi chạy thật ổn định một đợt rồi mới tăng. [/LIST] [/QUOTE]
Name
Xác nhận
Gửi đi
Diễn Đàn
Thủ thuật
Thủ thuật internet
Ubuntu 22.04: curl 7.81 làm chết request HTTP/2 khi gửi song song >100 – cách nâng curl 8.x cho PHP-FPM (không đụng hệ thống)
Top