PHP có cần được biên dịch không?

Biết cách biên dịch PHP sẽ mở ra một trong số ít cánh cửa cần thiết để đóng góp cho ngôn ngữ PHP. Khi bạn đã quen với điều này, bạn sẽ dễ dàng đóng góp theo nhiều cách hơn như chạy thử nghiệm và tải báo cáo lên, tự viết thử nghiệm mới và báo cáo/sửa lỗi

Tôi viết hướng dẫn ngắn này như một nỗ lực lấy cảm hứng từ bài đăng của Joe về Hệ số xe buýt hiện có bằng ngôn ngữ mà theo tôi là rất đáng báo động nhưng cần thiết. Với thời gian hạn chế của tôi giữa làm việc, viết bài, duy trì các dự án của mình VÀ đóng góp bằng nguồn PHP, điều đó có ý nghĩa hơn đối với tôi khi nhân rộng kiến ​​thức trên nguồn của PHP thay vì cố gắng giảm hệ số xe buýt xuống một (bản thân tôi)

Tôi chắc chắn sẽ đăng nhiều thứ hơn về lõi php, nhưng nếu bạn có nền tảng hoàn toàn về PHP và muốn tham gia nhiều hơn mà không cần đợi bài đăng của tôi (đó là cách chính xác), tôi biết rằng Nuno Maduro sẽ nói về PHP

Chúng ta sẽ truy cập mã nguồn của php có sẵn trên Github. Nhấn vào đây để truy cập nó

Nguồn của PHP được phân chia giữa lõi (/Zend) và giao diện (/ext)

Trước khi chúng tôi bắt đầu, tôi cần cung cấp cho bạn một lời giải thích quá đơn giản về cấu trúc thư mục của PHP. Có các thư mục

/ # apk add gcc autoconf libc-dev bison re2c make
1 và
/ # apk add gcc autoconf libc-dev bison re2c make
2

PHP có cần được biên dịch không?

/ # apk add gcc autoconf libc-dev bison re2c make
1 giữ mã của Máy ảo, còn được gọi là Máy ảo Zend (Zend VM). Nó chịu trách nhiệm mã hóa, phân tích cú pháp, biên dịch, quản lý ngăn xếp cuộc gọi và nói chung là chạy mã PHP

Nếu bạn không biết PHP có Máy ảo, vui lòng cân nhắc đọc bài đăng này giải thích về công cụ PHP và trình biên dịch Just in Time, nó giải thích cách php hoạt động từ nguồn PHP, thông qua quá trình biên dịch sang thời gian chạy và sẽ cung cấp cho bạn chìa khóa để . Không có gì nhiều phức tạp, chỉ cần đọc 😉

/ # apk add gcc autoconf libc-dev bison re2c make
2 là nơi phép màu xảy ra. Đây là thư mục dành cho các tiện ích mở rộng được hỗ trợ bởi nhóm PHP. Mọi chức năng và lớp tồn tại trong PHP đều đến từ thư mục này. Ví dụ: bên dưới
/ # apk add gcc autoconf libc-dev bison re2c make
5, bạn sẽ tìm thấy tất cả các chức năng đi kèm với PHP tiêu chuẩn. Các chức năng liên quan đến chuỗi có thể được nhìn thấy ở đây

Một cách để xem xét thư mục

/ # apk add gcc autoconf libc-dev bison re2c make
6 là nghĩ rằng mọi tiện ích mở rộng đều có một trình bao bọc cho thư viện C. một phần của mã C chỉ khả dụng cho các hoạt động PHP trong C

Lý do chính mà tôi nói với bạn về

/ # apk add gcc autoconf libc-dev bison re2c make
1 và
/ # apk add gcc autoconf libc-dev bison re2c make
6 là bạn sẽ luôn biên dịch
/ # apk add gcc autoconf libc-dev bison re2c make
1 khi biên dịch PHP. Nhưng bạn có thể chọn những tiện ích mở rộng mà bạn sẽ biên dịch cho tệp nhị phân PHP của mình. Điều này đặc biệt hữu ích để chạy thử nghiệm và gỡ lỗi

Mẩu chuyện dài. bạn có thể tắt hầu hết các tiện ích mở rộng và chọn tham gia các tiện ích mở rộng mà bạn muốn biên dịch. Bạn không thể từ chối biên dịch /Zend

Theo hướng dẫn này

Thông thường, bạn muốn chạy cái này trên máy cục bộ của mình, điều này có thể khiến bạn thất bại vì hàng ngàn lý do. phiên bản gói không khớp, gói bị hỏng, phần phụ thuộc không cho phép bạn nâng cấp…

Bởi vì tôi thực sự muốn bạn thành công, tôi sẽ chỉ chạy mọi thứ trong một thùng chứa docker trống trên núi cao. Bạn không cần nó để phát triển thường xuyên nếu bạn không muốn, nhưng tôi thực sự khuyên bạn nên sử dụng Docker ít nhất là trong lần đầu tiên bạn biên dịch PHP để tránh những phiền nhiễu vô ích

Vui lòng chạy lệnh bên dưới. Nó sẽ tạo ra một Docker container gần như không có chương trình và thư viện nào được cài đặt. Tất cả các lệnh trong hướng dẫn này coi như bạn sẽ chạy chúng bên trong vùng chứa này

$ docker run --rm -it alpine:3.13
/ # // we're in! A bash session inside a docker container

PHP có cần được biên dịch không?

Môi trường chuẩn bị. các gói cần thiết để biên dịch PHP từ nguồn

Mã nguồn của PHP có nhiều phần phụ thuộc. Một số trong số chúng liên quan đến biên dịch C, một số khác liên quan đến mã thông báo và phân tích cú pháp, một số khác là phụ kiện tùy thuộc vào tiện ích mở rộng bạn chọn

Các yêu cầu được liệt kê ở đây là yêu cầu tối thiểu cần thiết để thiết lập PHP thô, không có tiện ích mở rộng. Khi thêm các tiện ích mở rộng mới, bạn sẽ cần thêm nhiều phụ thuộc hơn vào danh sách này

Dưới đây tôi sẽ cung cấp cho bạn phần giới thiệu ngắn về từng phụ thuộc với hy vọng nó sẽ giúp bạn hiểu rõ hơn một chút và có khả năng khiến bạn tò mò về chúng

gcc

GCC (GNU C Compiler) là trình biên dịch C nguồn mở, được sử dụng rộng rãi bởi hầu hết các dự án C ngoài kia. Nó biến mã C thành các đối tượng nhị phân mà máy tính của bạn có thể thực thi

libc-dev

Ngôn ngữ C rất thô và không cung cấp các công cụ để xử lý chuỗi, tệp, mạng, v.v. Vì vậy, libc đến để giải cứu. nó là một tập hợp các chức năng sẽ giúp cho việc phát triển C trở nên lành mạnh hơn nhiều. bạn có thể đã thấy stdlib. h, đài phát thanh. h hoặc chuỗi. h ở đâu đó, tất cả đều từ libc

autoconf

Autoconf là một công cụ tạo cấu hình bản dựng. Chương trình này được thực hiện khi bạn chạy bước

/ # apk add curl
/ # cd /opt
/opt # curl -L https://github.com/php/php-src/archive/refs/heads/master.zip -o php.zip
/opt # unzip php.zip
/opt # cd php-src-master/
/opt # ls -la
0

bò rừng

Bison là một trình tạo trình phân tích cú pháp. Bất cứ khi nào bạn tìm thấy một tệp có phần mở rộng

/ # apk add curl
/ # cd /opt
/opt # curl -L https://github.com/php/php-src/archive/refs/heads/master.zip -o php.zip
/opt # unzip php.zip
/opt # cd php-src-master/
/opt # ls -la
1, bạn có thể chắc chắn rằng bản dựng của php sẽ sử dụng Bison để chuyển đổi tệp đó. tập tin y vào một. c tệp biết cách phân tích cú pháp mã thông báo

re2c

Re2C là một công cụ chịu trách nhiệm biên dịch các biểu thức chính quy thành các từ vựng C rất nhanh

chế tạo

Make là một công cụ tự động hóa xây dựng, rất linh hoạt. Nó đọc các định nghĩa từ Makefile cho biết hành động nào được yêu cầu cho một bước xây dựng nhất định

Có các bước biên dịch khác nhau, đây là lý do tại sao

Khi chúng tôi biên dịch mã C, thông thường chúng tôi chọn một máy mục tiêu. một kiến ​​trúc CPU cụ thể và một hệ điều hành cụ thể. Một tệp nhị phân được biên dịch cho Windows sẽ không dễ dàng chạy trên Linux nếu không có một số loại mô phỏng tại chỗ. Tương tự, chương trình 64-bit sẽ không chạy trên hệ thống 32-bit

Thậm chí còn phức tạp hơn khi bạn xem xét CPU. mỗi CPU có thể có cách xử lý opcode, đọc bộ nhớ, giao tiếp với BUS riêng. Vì vậy, công việc của gcc là, với một CPU mục tiêu và hệ điều hành mục tiêu, chuyển đổi mã C thành các tệp nhị phân dành riêng cho CPU và hệ điều hành mục tiêu đó. Đôi khi bạn cũng đang biên dịch thứ gì đó trên máy của mình để chạy trên thiết bị khác. với hệ điều hành khác nhau, CPU khác nhau và các đường dẫn thư viện có khả năng khác nhau

Tất cả các ràng buộc trên khiến rất khó để viết một Makefile duy nhất có thể nắm bắt tất cả các yêu cầu từ tất cả các nền tảng và CPU có thể. Vì vậy, dự án PHP làm gì (và đây là thông lệ phổ biến đối với các dự án C lớn) là tạo một Makefile thích hợp trước khi xây dựng

Phải mất nhiều macro m4, tạo tập lệnh

/ # apk add curl
/ # cd /opt
/opt # curl -L https://github.com/php/php-src/archive/refs/heads/master.zip -o php.zip
/opt # unzip php.zip
/opt # cd php-src-master/
/opt # ls -la
2 từ chúng và tập lệnh này khi được thực thi sẽ tạo một Makefile dành riêng cho nền tảng sẽ biên dịch PHP mà không gặp nhiều rắc rối cho bạn

Điều này có vẻ hơi kỳ lạ ngay bây giờ, nhưng hãy làm theo hướng dẫn biên soạn từng bước mà tôi đã viết cho bạn ở đây và hy vọng mọi thứ sẽ trở nên rõ ràng hơn

Hãy xây dựng PHP từ mã nguồn

Cài đặt các gói cần thiết

Để cài đặt các gói được đề cập ở trên trên Alpine linux phải đơn giản như lệnh apk sau

/ # apk add gcc autoconf libc-dev bison re2c make

PHP có cần được biên dịch không?

Ngoài ra, tôi sẽ tải xuống chương trình cURL để chúng tôi có thể tải xuống mã nguồn của php từ Github

/ # apk add curl
/ # cd /opt
/opt # curl -L https://github.com/php/php-src/archive/refs/heads/master.zip -o php.zip
/opt # unzip php.zip
/opt # cd php-src-master/
/opt # ls -la

PHP có cần được biên dịch không?

Nếu bạn đã chạy các lệnh trên, thì bây giờ bạn đã ở /opt/php-src-master và sẵn sàng bắt đầu quá trình biên dịch

Xây dựng kịch bản cấu hình

Máy nào cũng có đặc thù. Bộ xử lý của bạn có thể có kiến ​​trúc khác với của tôi, của bạn bè bạn hoặc của nhà cung cấp dịch vụ đám mây. Vì C cần thông tin rất cụ thể về bộ xử lý đích để biên dịch (và nhiều thứ khác), chúng tôi sử dụng trình tạo cấu hình

Chỉ cần chạy lệnh sau và bạn sẽ tạo một tệp thực thi

/ # apk add curl
/ # cd /opt
/opt # curl -L https://github.com/php/php-src/archive/refs/heads/master.zip -o php.zip
/opt # unzip php.zip
/opt # cd php-src-master/
/opt # ls -la
2. 3

/opt/php-src-master # ./buildconf

PHP có cần được biên dịch không?

Bước này đang sử dụng nhiều. m4 macro trong dự án này và biên dịch tệp

/ # apk add curl
/ # cd /opt
/opt # curl -L https://github.com/php/php-src/archive/refs/heads/master.zip -o php.zip
/opt # unzip php.zip
/opt # cd php-src-master/
/opt # ls -la
2 dựa trên chúng, sử dụng tệp
/ # apk add curl
/ # cd /opt
/opt # curl -L https://github.com/php/php-src/archive/refs/heads/master.zip -o php.zip
/opt # unzip php.zip
/opt # cd php-src-master/
/opt # ls -la
5 cho việc này. Làm thế nào tất cả những điều này hoạt động nằm ngoài phạm vi của hướng dẫn này. Ping cho tôi nếu bạn muốn biết thêm chi tiết

Tạo Makefile

Bây giờ chúng tôi có tập lệnh

/ # apk add curl
/ # cd /opt
/opt # curl -L https://github.com/php/php-src/archive/refs/heads/master.zip -o php.zip
/opt # unzip php.zip
/opt # cd php-src-master/
/opt # ls -la
2, chúng tôi có thể chạy nó để có được trình tạo tự động của chúng tôi. tệp Makefile

Chỉ cần chạy

/ # apk add curl
/ # cd /opt
/opt # curl -L https://github.com/php/php-src/archive/refs/heads/master.zip -o php.zip
/opt # unzip php.zip
/opt # cd php-src-master/
/opt # ls -la
7 với tham số
/ # apk add curl
/ # cd /opt
/opt # curl -L https://github.com/php/php-src/archive/refs/heads/master.zip -o php.zip
/opt # unzip php.zip
/opt # cd php-src-master/
/opt # ls -la
8 để ngăn cài đặt bất kỳ tiện ích mở rộng phụ kiện nào như ffi hoặc simplexml

/opt/php-src-master # ./configure --disable-all

Việc cấu hình sẽ làm là kiểm tra kiến ​​trúc máy, công cụ và thư viện bạn yêu cầu cũng như thư mục của chúng. Tất cả thông tin này sẽ được tổng hợp thành một Makefile

PHP có cần được biên dịch không?

Makefile đã tạo có thể được nhìn thấy ở đây

PHP có cần được biên dịch không?

Xây dựng mã nguồn PHP bằng cách sử dụng Make

Bây giờ bạn đã tạo sẵn Makefile, bạn chỉ cần chạy

/ # apk add curl
/ # cd /opt
/opt # curl -L https://github.com/php/php-src/archive/refs/heads/master.zip -o php.zip
/opt # unzip php.zip
/opt # cd php-src-master/
/opt # ls -la
9 là xong. Tôi đang thêm tùy chọn
/opt/php-src-master # ./buildconf
0 để tăng số lượng lõi được sử dụng trong quá trình biên dịch

/opt/php-src-master # make -j8

PHP có cần được biên dịch không?

Nếu mọi thứ suôn sẻ, bạn sẽ thấy một màn hình thành công nói rằng PHP đã được xây dựng thành công (Xây dựng hoàn tất. ) và bây giờ bạn có thể chạy bộ thử nghiệm

PHP có cần được biên dịch không?

Các tệp nhị phân của bạn có sẵn trong thư mục

/opt/php-src-master # ./buildconf
1. Bạn sẽ tìm thấy các mục tiêu khác nhau được biên dịch ở đó, chẳng hạn như các mục tiêu FPM và CLI

PHP có cần được biên dịch không?

Hãy tử tế và chạy thử nghiệm

Việc chạy thử nghiệm sẽ không chỉ khẳng định rằng php đã biên dịch của bạn hoạt động bình thường mà còn cho bạn cơ hội chia sẻ kết quả với cộng đồng trực tuyến. Các bài kiểm tra được cung cấp tại đây và các kỹ sư khác có thể sử dụng để thu thập thông tin cần thiết nhằm giải quyết vấn đề (cảm ơn về gợi ý của Daniel (@geekcom2). )

Chỉ cần nhập hành động thử nghiệm từ tệp thực hiện của bạn

/opt/php-src-master # make test

Nếu PHP thất bại trong bất kỳ kiểm tra nào, bạn sẽ thấy một màn hình tương tự như sau

PHP có cần được biên dịch không?

Bằng cách chọn gửi báo cáo, bạn đã đóng góp cho cộng đồng PHP. Mát mẻ, phải không?

(Tùy chọn) Cài đặt PHP

Nếu bạn hài lòng với phiên bản đã biên dịch mà bạn có và muốn làm cho php đã biên dịch của bạn có thể truy cập được trên toàn cầu trên máy của bạn, chỉ cần chạy hành động

/opt/php-src-master # ./buildconf
2 từ tệp thực hiện của bạn

/opt/php-src-master # make install

PHP có cần được biên dịch không?

Tôi khuyên bạn không nên cài đặt PHP đã biên dịch trừ khi bạn biết rất rõ mình đang làm gì. Nếu bạn chỉ cần sử dụng nó để thử nghiệm hoặc sân chơi, hãy tạm thời sử dụng bí danh hoặc thêm nó vào biến PATH của bạn

Các vấn đề và lỗi thường gặp

Đối với những bạn biết lập trình C, đây có lẽ không phải là điều ảnh hưởng trực tiếp đến bạn. Bởi vì, tốt, bạn đã quen với một số quy ước. Đối với các kỹ sư PHP chỉ là người dùng trong thế giới C này, tôi đã quyết định thu thập một số gợi ý để làm cho quy trình dễ dàng hơn

Những gợi ý như vậy tôi đã thu thập bằng cách hỏi mọi người trên twitter và với một công cụ khảo sát trên trang web này về những vấn đề họ đã gặp phải khi biên dịch PHP. Dưới đây là tóm tắt về vấn đề và một số gợi ý của tôi

Tôi đã làm theo hướng dẫn này từng bước và không thể có bản dựng hoạt động

Tôi nghi ngờ trường hợp này sẽ xảy ra vì chúng ta đang ở trong một môi trường khá biệt lập, khả năng xảy ra sự cố nếu bạn làm theo từng bước mà không thay đổi một lệnh nào là rất thấp

Nhưng nếu nó vẫn xảy ra, hoặc nếu bạn đã thay đổi điều gì đó và nó đã xảy ra, mẹo chính mà tôi có thể cung cấp cho bạn ở đây là. đọc thông báo lỗi. Thực sự, ĐỌC thông báo lỗi

Tất nhiên tôi không muốn làm bạn cảm thấy ngu ngốc, hầu hết chúng ta bỏ qua các thông báo lỗi vì trong vùng đất PHP, chúng ta đã quá quen với các kết quả đầu ra đầy màu sắc làm nổi bật hành động chúng ta nên thực hiện, thường không thực sự quan tâm đến nguyên nhân gốc rễ của vấn đề. Ở đất C, điều này không phổ biến. Nhưng thông thường, lỗi là điều cuối cùng bạn nhìn thấy trên màn hình, bởi vì một thông lệ phổ biến là hủy bỏ ngay sau khi xảy ra lỗi

Nếu bạn không thể đọc tốt tiếng Anh, bạn sẽ phải đoán mọi thứ dựa trên các ký hiệu. Một gợi ý cho bạn trong trường hợp này là trong các dự án C, nếu có lỗi, lỗi sẽ là điều cuối cùng xảy ra trên chương trình đó và chương trình sẽ bị hoảng loạn (thoát với mã lỗi)

Ví dụ: việc bật tiện ích mở rộng Simplexml sẽ phá vỡ bản dựng của chúng tôi vì một số lý do

/opt/php-src-master # ./configure --disable-all --enable-simplexml

PHP có cần được biên dịch không?

Bằng cách sử dụng cờ “--disable-all”, chúng tôi đã vô hiệu hóa mọi tiện ích mở rộng tùy chọn, bao gồm tiện ích mở rộng

/opt/php-src-master # ./buildconf
3 bổ sung hỗ trợ XML cho lõi. Đây là cách lỗi sẽ như thế nào trong trường hợp này

PHP có cần được biên dịch không?

Lưu ý cách thông báo

/opt/php-src-master # ./buildconf
4 xuất hiện lần cuối. Đó thường là cách mọi thứ hoạt động với các dự án C. một lỗi và toàn bộ bản dựng bị sập ngay lập tức

Hãy nhanh chóng truy cập trang Simplexml trong hướng dẫn sử dụng PHP. Có cả một phần về thao tác xml và một trong số đó là trang mở rộng SimpleXML. Ở đó, bạn sẽ tìm thấy trang “Cài đặt > Yêu cầu”

Trên trang này, chúng tôi thấy rằng "Tiện ích mở rộng này yêu cầu tiện ích mở rộng libxml PHP. " ngay cả với một liên kết. Cả trang

/ # apk add curl
/ # cd /opt
/opt # curl -L https://github.com/php/php-src/archive/refs/heads/master.zip -o php.zip
/opt # unzip php.zip
/opt # cd php-src-master/
/opt # ls -la
2 và sách hướng dẫn đều được căn chỉnh. chúng tôi không thể cài đặt tiện ích mở rộng SimpleXML mà không bật tiện ích mở rộng libxml. Vì vậy, về mặt lý thuyết, chúng ta chỉ cần thêm cờ
/opt/php-src-master # ./buildconf
6 và mọi thứ sẽ được giải quyết

Nhưng giờ chúng tôi đã được tiêm phòng và biết rằng có lẽ chúng tôi nên kiểm tra trang yêu cầu trước khi cố gắng xây dựng lại để tránh lãng phí thời gian . Trước tiên, hãy mở trang thủ công của tiện ích mở rộng libxml và kiểm tra các phụ thuộc. Nó nói rằng cần phải có

/opt/php-src-master # ./buildconf
7. Sau đó, chúng tôi cài đặt nó và xây dựng với các phần mở rộng libxml và simplexml.

PHP có cần được biên dịch không?

Và làm cách nào để tôi biết rằng

/opt/php-src-master # ./buildconf
6 là lá cờ chính xác để sử dụng? . “cấu hình. lỗi. Tiện ích mở rộng SimpleXML yêu cầu độ căng LIBXML, hãy thêm --with-libxml”

Tôi không thể đoán đơn giản là có những phụ thuộc nào

Điều này rất đúng. Cho đến nay, tôi chưa thấy một dự án C nào có trình quản lý phụ thuộc sẽ tự động tải xuống mọi thứ cho bạn như Composer hoặc NPM sẽ làm

Với các chương trình C, thông thường bạn nên thực hiện các phụ thuộc theo cách thủ công và tin tôi đi, điều này có thể rất có lợi. Ví dụ: thực tế phổ biến này làm giảm kích thước của tệp nhị phân đang được tạo, vì nhiều thư viện và phần phụ thuộc được liên kết động khi tải chương trình (DLL cũ tốt /. so) thay vì sao chép toàn bộ

Tốt nhất, khi kích hoạt một tiện ích mở rộng nào đó, bạn nên tìm kiếm trang hướng dẫn của nó. Mọi tiện ích mở rộng PHP tích hợp đều đi kèm với sách hướng dẫn bao gồm trang Cài đặt, bạn sẽ tìm thấy tất cả các yêu cầu thư viện ở đó

Tôi vẫn thấy sự cố ngay cả khi làm theo hướng dẫn này từng bước

Cũng có thể là bài viết này đã lỗi thời. PHP là một dự án rất tích cực, mọi thứ luôn thay đổi và bạn cần thích nghi. Lấy ý tưởng của bài viết này làm hướng dẫn để bạn tìm hiểu cách cấu trúc các dự án C và logic đằng sau chúng, sau đó áp dụng để tự mình tìm ra mọi thứ

Thông thường khi các thay đổi vi phạm được giới thiệu, chúng được ghi lại trong mã nguồn thông qua các tệp NỘI BỘ NÂNG CẤP và NÂNG CẤP. Hãy đọc nếu bạn chắc chắn rằng bạn có thể xây dựng nó trước đây nhưng bây giờ có thứ gì đó đang bị hỏng. (Một lần nữa xin cảm ơn Daniel (@geekcom2) vì mẹo tuyệt vời này. )

Làm cách nào để biết phụ thuộc nào thậm chí có sẵn

Có rất nhiều thẻ biên dịch có sẵn mà chúng ta có thể chuyển đến tập lệnh

/ # apk add curl
/ # cd /opt
/opt # curl -L https://github.com/php/php-src/archive/refs/heads/master.zip -o php.zip
/opt # unzip php.zip
/opt # cd php-src-master/
/opt # ls -la
2, nhưng làm thế nào để tìm thấy tất cả chúng?

Tốt nhất là bạn nên biết mình muốn bật tiện ích mở rộng nào, kiểm tra trang cài đặt của chúng và bạn sẽ tìm ra thẻ nào là cần thiết. Đảm bảo rằng bạn đã đọc các trang

/opt/php-src-master # ./configure --disable-all
0 và
/opt/php-src-master # ./configure --disable-all
1, chúng rất cần thiết và sẽ mang lại các cờ biên dịch chính xác mà bạn cần thêm

Nếu vì lý do nào đó bạn không thể (hoặc không muốn) truy cập các trang hướng dẫn, bạn luôn có thể kiểm tra mã ngoại tuyến. Sau khi bạn chạy

/ # apk add curl
/ # cd /opt
/opt # curl -L https://github.com/php/php-src/archive/refs/heads/master.zip -o php.zip
/opt # unzip php.zip
/opt # cd php-src-master/
/opt # ls -la
0, một tệp
/ # apk add curl
/ # cd /opt
/opt # curl -L https://github.com/php/php-src/archive/refs/heads/master.zip -o php.zip
/opt # unzip php.zip
/opt # cd php-src-master/
/opt # ls -la
2 sẽ được tạo trên thư mục php-src của bạn. Chỉ cần chạy tệp này với cờ
/opt/php-src-master # ./configure --disable-all
4

/opt/php-src-master # ./configure --help

Lệnh trên sẽ xuất ra một danh sách dài các cờ biên dịch và các biến môi trường mà bạn có thể thay đổi trước khi tạo Makefile của mình

Điều gì sẽ xảy ra nếu tôi cần sử dụng thư viện tùy chỉnh hoặc không muốn cài đặt chúng trên toàn cầu

Thông thường, bạn sẽ thấy mình cần sử dụng một phiên bản thư viện cụ thể để xây dựng PHP, nhưng hệ thống của bạn đã có một phiên bản khác và việc nâng cấp/hạ cấp nó cho toàn bộ hệ thống của bạn nghe có vẻ hơi đáng sợ. tôi cảm thấy bạn

Ví dụ, một tùy chọn bạn có là sử dụng một môi trường biệt lập với Máy ảo hoặc Docker. Nhưng điều này sẽ không hoạt động cho tất cả các trường hợp sử dụng

Một tùy chọn khác là tải xuống và xây dựng thủ công thư viện mục tiêu của bạn vào một thư mục khác, chẳng hạn như /opt/the-library-youve-just-build. Bằng cách này, bạn có thể biên dịch thư viện và chọn không cài đặt nó vào hệ thống, tạo các đối tượng dùng chung không khả dụng trên toàn cầu và sẽ không làm hỏng hệ điều hành của bạn

Nếu bạn chọn tùy chọn thư viện được biên dịch thủ công, bạn phải gợi ý tập lệnh

/ # apk add curl
/ # cd /opt
/opt # curl -L https://github.com/php/php-src/archive/refs/heads/master.zip -o php.zip
/opt # unzip php.zip
/opt # cd php-src-master/
/opt # ls -la
2 để nó biết tìm thư viện ở đâu. Bạn có thể làm điều này thông qua các biến môi trường. Thậm chí còn có một mục về điều đó trên trang web chính thức

/ # apk add gcc autoconf libc-dev bison re2c make
0

Tôi đã quản lý để biên dịch PHP nhưng không thể tìm thấy tệp nhị phân

PHP sẽ xây dựng và đặt các tệp nhị phân trong thư mục

/opt/php-src-master # ./configure --disable-all
6. Có nhiều tệp nhị phân khác nhau, chẳng hạn như tệp nhị phân fpm, cli và nhúng, hãy chọn tệp nhị phân bạn cần

Cảm ơn Cộng đồng đã giúp tôi xây dựng bài viết này

Lần này thay vì tự mình viết và nghiên cứu mọi thứ, tôi quyết định nhờ cộng đồng PHP hỗ trợ, đặc biệt là với phần "Những vấn đề và lỗi thường gặp". Tôi sẽ bỏ một số tên và cách xử lý twitter để nhận ra và cảm ơn tất cả

Theo dõi những người này nếu bạn cũng như tôi, muốn làm cho PHP khóc. Tôi đảm bảo nội dung và thông tin chi tiết tuyệt vời

  • Diana Arnos (@dianaarnos)
  • Daniel (@geekcom2)
  • Leo Cavalcante (@leocavalcante)
  • Marcel dos Santos (@marcelgsantos)
  • Vinícius Dias (@cviniciussdias)
  • Luis Machado Reis (@luismachadoreis)
  • Dev Frustrado (@geckones)
  • Robson Pierre (@robsonpiere)

Một số đóng góp là trực tiếp, với tuyên bố rõ ràng. Những người khác chỉ tuyên truyền tiếng nói của tôi để tôi có thể tiếp cận nhiều người hơn. Tôi rất biết ơn tất cả các bạn đã giúp đỡ tôi

Ngoài ra, đừng quên theo dõi tôi trên twitter nếu bạn thích loại nội dung tôi chia sẻ và muốn xem nội dung PHP ngẫu nhiên trên nguồn cấp dữ liệu của bạn. @nawarian

Cái gì tiếp theo?

Bây giờ bạn đã quen với việc biên dịch PHP từ mã nguồn, tại sao bạn không tiếp tục và chạy thử nghiệm, có thể phá vỡ chúng bằng cách thay đổi mã C?

Ngôn ngữ PHP có cần biên dịch không?

Về cơ bản, PHP được thông dịch nhưng PHP được biên dịch thành mã byte trung gian, sau đó được công cụ Zend thời gian chạy thông dịch .

Các tập lệnh PHP được biên dịch như thế nào?

Biên dịch. Nếu không sử dụng JIT, PHP ở dạng chuẩn của nó được biên dịch từ AST được tạo thành OPCode , chứ không phải – như trường hợp của JIT – thành mã máy. Quá trình biên dịch được thực hiện bằng cách duyệt đệ quy AST, như một phần trong đó một số tối ưu hóa cũng được thực hiện.

Ngôn ngữ nào biên dịch thành PHP?

Phel là một ngôn ngữ lập trình chức năng biên dịch sang PHP. Nó là một phương ngữ của Lisp lấy cảm hứng từ Clojure và Janet

PHP có cần thông dịch viên không?

Hiện tại, PHP hoàn toàn phụ thuộc vào trình thông dịch nâng cao có tên là Zend Engine . Để tìm hiểu thêm về PHP là gì và cách viết một chương trình PHP nâng cao, bạn nên đọc thêm về cú pháp của nó. Như tôi đã đề cập trước đây, PHP phụ thuộc vào trình thông dịch Zend Engine.