HipHop bài toán chưa giải được
Ấy là đối với tôi, không biết với các bạn ra sao. Chứ riêng tôi, đành tạm ngưng dự án này lại, đợi xem tình hình vài tháng tiếp ra sao. Vì hiện tại quá ư là *unstable*.
Cài trên Gentoo không sao, nhưng ý định compile lên system CentOS/RHEL có lẽ đã thất bại. Ban đầu tôi thử với các RPM tại sourceforge, sau đó với RPM tôi tự modified/build dựa trên các SRPM cũ. Các bạn có thể tự build lấy hoặc xài có sẵn cũng được. Nhớ yum các rpm thiếu như yêu cầu. Chỉ riêng đối với hphp, tôi khuyến cáo các bạn lấy SRPM về rồi rebuild lại. Tôi có 2 bản: 1 bản thường, và 1 bản để chạy với nginx (Chuyển X_REAL_IP sang REMOTE_IP để không phải sửa quá nhiều code PHP khi chạy).
Do build trên kernel custom (2.6.29 để sử dụng AIO) nên khi build tôi gặp lỗi với capability.cpp. Sau khi đọc tài liệu mới thấy rằng kernel không còn sử dụng capability module nữa. Do đó phải upgrade lên libcap2 (2.19). Các bạn có thể yên tâm khi dùng rpm --nodeps --force vì libcap2 có tương thích ngược với libcap1.
Các bạn không thể sử dụng boost-1.33 đi kèm với CentOS/RHEL 5.4, phiên bản có thể sử dụng được là 1.37,1.38,1.41. Các bạn không nên xài boost 1.42, có confirm từ cộng đồng Hiphop PHP là có bug.
PHP packages: tại sao tôi không xài như rpm trên SourceForge? phiên bản SF xài là của Oracle Enterprise Linux. Nếu cài vô CentOS phát sinh ra khá nhiều dependency đi kèm. Do vậy tôi có build lại bộ riêng dựa trên CentOS Plus.
Các RPM còn lại, tôi có bỏ bớt các patch đi kèm trong SRPM(có recompile luôn cả GCC nhưng không khuyến cáo các bạn sử dụng). Để các patch mặc định thậm chí không thể chạy hphp lên được.
Với những info trên, các bạn đã dư sức compile được hphp. Tuy nhiên, điều tôi muốn nói là phần biên dịch PHP -> C++.
Thực ra, trong tất cả trường hợp thử đơn giản php+mysql+mysqli+odbc+imap+gd+session và một số simple function thì hoạt động đúng.
Nhưng khi sử dụng thêm các module php khác như zip, xsl, pdo, mhash, bcmath, mcrypt thì tính năng code_optimization không thể hoạt động được (khi đến generate CPP files bị SEGFAULT) trên CentOS. Có thể liên quan tới các package re2c, bison, flex, mhash. Tôi không còn thời gian để thử lại các package này nên tôi bỏ qua.
hphp rất khó chịu với constant trong PHP. Đơn giản như ví dụ sau sẽ không thể nào compile được trên hphp. Do đó khi xài các constant chắc chắn các bạn sẽ gặp vấn đề với hphp. Ví dụ như sau:
Các bạn sẽ gặp lỗi:
Khi sử dụng hphp, nếu bị bất kỳ lỗi nào đó. Đầu tiên các bạn nên thử giảm thông số code optimization xuống hoặc có thể loại bỏ hẳn. (--optimize-level=0). Sau đó thử chạy với thông số --target=analyze để xem info về code của mình. Có thể dựa vào đó để sửa lại các code PHP cho thích hợp (SameFunction, UndefinedVar, InvalidConstant...)
Một số ... trường hợp khó hiểu sau, tôi không giải thích được. Ví dụ dưới đây, file funcsv2.orig.php và funcsv2.php là 1 file. Nhưng nếu bỏ funcsv2.orig.php hoặc chuyển funcsv2.php lên ví trị đó thì hphp sẽ báo lỗi.
Lỗi với magic_function, (iamhuy thử cái này).
Khi code PHP, bật E_STRICT lên để còn hy vọng sử dụng được với hphp.
Khi đọc code CPP sinh ra, nếu thông số optimize-level=0, code sinh ra quả là... 1 đống rác. Do vậy không chắc hphp sẽ chạy nhanh hơn đâu nhé. Ngoài ra chưa kể bị memory leak (unconfirmed). Trong tuần tới tôi sẽ thử kết quả benchmark ra sao. Bao gồm Request/Reply Rate, CPU waste, mem waste/leak.
Dù sao, tôi cũng sẽ tạm ngưng nghiên cứu sâu thêm về hphp. Hiện hphp chỉ hoạt động tốt với "Simple PHP Code". Tôi nghĩ các CMS đơn giản hiện nay hầu hết sẽ hoạt động được. Còn để như target tôi muốn thì còn xa, sẽ quay lại với hphp sau khoảng 3 tháng nữa :D
Vui lòng reference nếu sử dụng tài liệu này để tham khảo cho công việc của bạn.
Cài trên Gentoo không sao, nhưng ý định compile lên system CentOS/RHEL có lẽ đã thất bại. Ban đầu tôi thử với các RPM tại sourceforge, sau đó với RPM tôi tự modified/build dựa trên các SRPM cũ. Các bạn có thể tự build lấy hoặc xài có sẵn cũng được. Nhớ yum các rpm thiếu như yêu cầu. Chỉ riêng đối với hphp, tôi khuyến cáo các bạn lấy SRPM về rồi rebuild lại. Tôi có 2 bản: 1 bản thường, và 1 bản để chạy với nginx (Chuyển X_REAL_IP sang REMOTE_IP để không phải sửa quá nhiều code PHP khi chạy).
rpmbuild --rebuild --target=x86_64 hiphop-php-1.0-2.20100308.el5.src.rpm
Các bạn không thể sử dụng boost-1.33 đi kèm với CentOS/RHEL 5.4, phiên bản có thể sử dụng được là 1.37,1.38,1.41. Các bạn không nên xài boost 1.42, có confirm từ cộng đồng Hiphop PHP là có bug.
PHP packages: tại sao tôi không xài như rpm trên SourceForge? phiên bản SF xài là của Oracle Enterprise Linux. Nếu cài vô CentOS phát sinh ra khá nhiều dependency đi kèm. Do vậy tôi có build lại bộ riêng dựa trên CentOS Plus.
Các RPM còn lại, tôi có bỏ bớt các patch đi kèm trong SRPM(có recompile luôn cả GCC nhưng không khuyến cáo các bạn sử dụng). Để các patch mặc định thậm chí không thể chạy hphp lên được.
Với những info trên, các bạn đã dư sức compile được hphp. Tuy nhiên, điều tôi muốn nói là phần biên dịch PHP -> C++.
Thực ra, trong tất cả trường hợp thử đơn giản php+mysql+mysqli+odbc+imap+gd+session và một số simple function thì hoạt động đúng.
Nhưng khi sử dụng thêm các module php khác như zip, xsl, pdo, mhash, bcmath, mcrypt thì tính năng code_optimization không thể hoạt động được (khi đến generate CPP files bị SEGFAULT) trên CentOS. Có thể liên quan tới các package re2c, bison, flex, mhash. Tôi không còn thời gian để thử lại các package này nên tôi bỏ qua.
hphp rất khó chịu với constant trong PHP. Đơn giản như ví dụ sau sẽ không thể nào compile được trên hphp. Do đó khi xài các constant chắc chắn các bạn sẽ gặp vấn đề với hphp. Ví dụ như sau:
<? define('A', "B"); define('A_'.A, "B"); echo A_B; ?>
hphp: /usr/include/boost/smart_ptr/shared_ptr.hpp:418: T* boost::shared_ptr< <te mplate-parameter-1-1> >::operator->() const [with T = HPHP::BlockScope]: Asserti on `px != 0' failed.
Một số ... trường hợp khó hiểu sau, tôi không giải thích được. Ví dụ dưới đây, file funcsv2.orig.php và funcsv2.php là 1 file. Nhưng nếu bỏ funcsv2.orig.php hoặc chuyển funcsv2.php lên ví trị đó thì hphp sẽ báo lỗi.
Server10 web # diff -y files.list files.list.worked
./login.php ./login.php
> ./funcsv2.orig.php
./config.php ./config.php
./index.php ./index.php
./admin.php ./admin.php
./announce.php ./announce.php
./scrape.php ./scrape.php
./torrent_functions.php ./torrent_functions.php
./sha1lib.php ./sha1lib.php
./seed.php ./seed.php
./funcsv2.php ./funcsv2.php
Khi code PHP, bật E_STRICT lên để còn hy vọng sử dụng được với hphp.
Khi đọc code CPP sinh ra, nếu thông số optimize-level=0, code sinh ra quả là... 1 đống rác. Do vậy không chắc hphp sẽ chạy nhanh hơn đâu nhé. Ngoài ra chưa kể bị memory leak (unconfirmed). Trong tuần tới tôi sẽ thử kết quả benchmark ra sao. Bao gồm Request/Reply Rate, CPU waste, mem waste/leak.
Dù sao, tôi cũng sẽ tạm ngưng nghiên cứu sâu thêm về hphp. Hiện hphp chỉ hoạt động tốt với "Simple PHP Code". Tôi nghĩ các CMS đơn giản hiện nay hầu hết sẽ hoạt động được. Còn để như target tôi muốn thì còn xa, sẽ quay lại với hphp sau khoảng 3 tháng nữa :D
Vui lòng reference nếu sử dụng tài liệu này để tham khảo cho công việc của bạn.
bài viết của anh rất hay tuy nhiên còn thiếu nhiều thứ nữa để có thể build hiphop trên CentOS 5 (x64) .như cái glibc phải có GLIBCXX_3.4.9 .hay gcc phải là 4.3 trở nên nữa. nhưng bài biết này rất là hay về các bug của hiphop. Em mới cài xong nên chưa thử các trường hợp. rất cám ơn anh nhiều. nếu có thể cho em xin mail của anh để có gì em xin phép hỏi một chút ạ.
Comment by nguyễn văn cường — 6/25/10 10:52 PM | # - re
hi bạn, đã 3 tháng rồi, bạn quay lại với HipHop chưa :)
Comment by Thinh — 7/6/10 10:10 AM | # - re
Hi Thinh, Hiện vẫn chưa thấy "tia sáng" nào cho session trên hiphop-php để sử dụng với những mục đích thường dùng. Thay vào đó vì facebook sử dụng memcached nên gần như không ai contribute. Do đó mình vẫn chưa có dự định nghiên cứu tiếp. Ngoài ra như mình đã đề cập, việc port lại PHP sang hiphop-php mất khá nhiều thời gian để viết lại code cho "tâm đầu ý hợp" nên không phù hợp với business lắm do đó mình không còn được funding time nhiều nữa. Mình hướng hệ thống sử dụng các ngôn ngữ khác như python, ruby hoặc viết hẳn flatform riêng bằng C++.
Nếu bạn có viết code bằng python, có thể tham khảo github.com/facebook/tornado
Comment by root — 8/27/10 9:09 PM | # - re