Bạn có thể biên dịch mã PHP mã PHP và tải lên tệp nhị phân, tệp này sẽ được chạy bởi trình thông dịch mã byte không?


224

Tôi biết rằng PHP được biên dịch thành mã byte trước khi nó được chạy trên máy chủ và sau đó mã byte đó có thể được lưu vào bộ đệm để toàn bộ tập lệnh không phải diễn giải lại với mỗi lần truy cập web.

Nhưng bạn có thể "biên dịch" mã PHP và tải lên tệp nhị phân, tệp này sẽ được chạy bởi trình thông dịch mã byte không?


Một câu hỏi liên quan: Trình biên dịch PHP cho Windows
Palec

3
Xin vui lòng không gắn thẻ này với hhvm cũng như hiphop . HHVM không phải là một phần vốn có của câu hỏi, chỉ là một câu trả lời có thể. meta.stackexchange.com/a/149347/238706
Palec

@HalayemAnis Tôi nghĩ rằng bạn đã đề cập đến một liên kết sai .. Bạn có thể cung cấp liên kết chính xác cho hướng dẫn đó không? hoặc bất kỳ kẻ cập nhật mới nhất?
CJ Ramki

@CJRamki xin lỗi, vui lòng sử dụng liên kết này COMPILE_PHP
Halayem Anis

Câu hỏi này thực sự khá mơ hồ. Bạn có thể "đơn giản" xây dựng trình biên dịch PHP biên dịch (theo nghĩa đầy đủ nhất của nó) mã nguồn của bạn và trình thông dịch PHP thành ELF, EXE hoặc bất cứ thứ gì.
Sebastian Mach

Câu trả lời:


234

Sau khi câu hỏi này được đặt ra, Facebook đã ra mắt HipHop cho PHP , đây có lẽ là trình biên dịch PHP được thử nghiệm tốt nhất cho đến nay (xem như nó đã điều hành một trong 10 trang web lớn nhất thế giới). Tuy nhiên, Facebook đã ngừng sử dụng HHVM, đây là một máy ảo chứ không phải trình biên dịch.

Ngoài ra, googling PHP compilerbật lên một số giải pháp của bên thứ 3.

Bánh Đào

  • PeachPie GitHub
  • biên dịch PHP sang .NET và .NET Core
  • có thể được biên dịch thành tập tin nhị phân độc lập
  • chạy trên Mac, Linux, Windows, Windows Core, ARM, ...

Phalanger

  • GitHub (tải xuống), Wikipedia
  • biên dịch sang .NET (CIL) có vẻ đã ngừng hoạt động từ tháng 7 năm 2017 và dường như không hỗ trợ PHP 7.

phc

  • biên dịch thành nhị phân riêng
  • bây giờ không hoạt động nhiều (tháng 2 năm 2014) - phiên bản cuối cùng vào năm 2011, thay đổi cuối cùng vào mùa hè 2013

Trình biên dịch PHP Roadsend

máy tính

  • Phần mở rộng PECL của PHP
  • thực nghiệm
  • biên dịch sang mã byte PHP, nhưng có thể gói nó trong tệp nhị phân Windows tải trình thông dịch PHP (xem bcompiler_write_exe_footer()hướng dẫn sử dụng )
  • có vẻ đã ngừng ngay bây giờ (tháng 2 năm 2014) - thay đổi cuối cùng trong năm 2011

Dự án số không

  • Wikipedia , IBM
  • vườn ươm các thay đổi cho WebSphere sMash
  • được IBM hỗ trợ
  • biên dịch sang mã byte Java
  • có vẻ đã ngừng hoạt động ngay bây giờ (tháng 2 năm 2014) - trang web ngừng hoạt động, có vẻ như sự cường điệu trong năm 2008 và 2009

Bambalam

  • biên dịch thành nhị phân Windows độc lập
  • các nhị phân chứa mã byte và trình khởi chạy
  • có vẻ đã ngừng ngay bây giờ (tháng 2 năm 2014) - thay đổi cuối cùng trong năm 2006

Nhị phân

  • biên dịch sang C ++
  • có vẻ đã ngừng ngay bây giờ (tháng 2 năm 2014) - thay đổi cuối cùng trong năm 2003

Còn máy chủ web dùng chung thì sao? Tôi có thể biên dịch tập lệnh PHP của mình với một trong những trình biên dịch đó và sau đó tải lên máy chủ web dựa trên linux của mình không?
SaidbakR

2
@ sємsє tùy thuộc vào máy chủ của bạn, nhưng nếu tôi phải đoán, tôi đoán nhiều máy chủ sẽ không cho phép.
Nông dân Frank

2
Không có dự án nào ở trên dường như được duy trì nữa. Có một trình biên dịch thường được chấp nhận kể từ 2 năm qua hay tại sao tất cả các dự án đó bị coi thường / bị bỏ rơi?
Preexo

Một danh sách đẹp các trình biên dịch PHP có tại thefreecountry.com. Tất cả các công cụ được đề cập có trong câu trả lời này ngay bây giờ.
Palec

1
Vì tất cả những thứ này dường như đã chết, câu trả lời dường như là "không".
Ira Baxter

22

Câu trả lời ngắn gọn là không".

Việc triển khai PHP hiện tại là ngôn ngữ được diễn giải. Bạn có thể tranh luận các khía cạnh lý thuyết của thực tế là bất kỳ ngôn ngữ nào về mặt kỹ thuật đều có thể được giải thích hoặc biên dịch, nhưng vì thế, các triển khai hiện tại là mã PHP yêu cầu trình thông dịch chạy và trình thông dịch quản lý môi trường thực thi.

Để trả lời câu hỏi của bạn về việc tải lên mã byte PHP được biên dịch sẵn, có thể là có thể, nhưng bạn phải thực hiện một cách để trình thông dịch PHP đọc trong một tệp như vậy và làm việc với nó. Với các bộ đệm opcode hiện có đã có, nó dường như không phải là một nhiệm vụ sẽ gặt hái được nhiều phần thưởng.


3
Thông thường bạn cần một trình thông dịch để chạy các chương trình PHP đúng cách, nhưng điều đó không có nghĩa là trình biên dịch không thể cung cấp nó trong mã được biên dịch. phc (phpcompiler.org) xử lý tất cả các vấn đề bạn mô tả. Theo hiểu biết tốt nhất của tôi, Roadsend (roadsend.com) cũng vậy.
Paul Biggar

28
Câu trả lời này đã hết hạn - HipHop đã được phát hành 6 tháng sau khi được đăng, vào tháng 2 năm 2010
Frank Farmer

1
@FrankFarmer Bạn đã có kinh nghiệm gì với HipHop chưa? HipHop có hoạt động đúng với includerequirekhông? Ví dụ: nếu tập lệnh PHP thường được bao gồm include( 'controller/' . $controller_name . '.php' )thì phần này sẽ tự động hoạt động với HipHop? chúc mừng
Lea Hayes

2
Thực tế bạn có thể biên dịch mã PHP, sử dụng các trình biên dịch PHP thông thường. Nó chỉ phụ thuộc vào nền tảng mục tiêu; bạn có thể biên dịch thành Zend opcode, ngôn ngữ C hoặc thành các cụm .NET (sử dụng Phalanger php-compiler.net )
Jakub Míšek

1
The short answer is "no". The current implementation of PHP is that of an interpreted language. You can argue the theoretical aspects…Không có gì lý thuyết về nó, rất nhiều ngôn ngữ được dịch có trình biên dịch; viz AutoIt / AutoHotkey, hoặc thậm chí xa như BASIC. Có rất nhiều chương trình đã được viết trong đó, sau đó được công chúng biên soạn để sử dụng làm chương trình độc lập. Không có gì đặc biệt về PHP để ngăn chặn nó có thể biên dịch được, đó là lý do tại sao tồn tại một loạt các trình biên dịch, nhưng không giống như AHK, không có trình biên dịch chính thức, đã được thử nghiệm, Z Z Guard Guard không hoàn toàn được tính.
Synetech

16

Kể từ khi câu hỏi được đặt ra lần đầu tiên, đã có một sự thay đổi cho câu trả lời đó từ "không" thành "loại"

http://github.com/facebook/hiphop-php/wiki

Hip Hop cho PHP là trình biên dịch lấy mã PHP và biến nó thành C ++ được tối ưu hóa cao. Rõ ràng, một số chức năng không được hỗ trợ (ví dụ: 'explode')

Tôi đã tìm thấy câu hỏi này trong khi tìm kiếm thêm thông tin về cách triển khai HipHop và nghĩ rằng tôi sẽ lên tiếng :)

Tuy nhiên, kể từ năm 2013, Facebook không còn sử dụng nó nữa và nó đã bị ngừng sử dụng HHVM, đây không phải là trình biên dịch: https://en.wikipedia.org/wiki/HipHop_for_PHP


3
Đây là những gì facebook sử dụng mà tôi tin
Richard H

"Loại" nói dối bây giờ là một vài năm sau và vì HHVM (HipHop Php) đang ngày càng tốt hơn mỗi ngày, nên cuối cùng là một cách (tôi nghĩ). Sử dụng HHVM ngày nay có thể sử pre-analyzedụng mã php. Kết quả là bạn nhận được một tệp Binary-Cache. Với tệp này và cấu hình HHVM chính xác, có thể chạy một trang web chỉ bằng mã byte, không cần các tệp nguồn nữa;) <br> Tôi hy vọng tôi đã hiểu đúng.
PKeidel

@Andrea, ý bạn là gì khi HHVM bị phản đối? Nó trông duy trì và sống như một dự án. Hay bạn có nghĩa là tên đã thay đổi từ Hip Hop cho PHP thành HHVM? Sau đó nói về sự phản đối là sai lệch.
Palec

1
@Palec HipHop cho PHP đã bị ngưng. Đó là trình biên dịch PHP-to-C ++ mà Facebook đã sử dụng, nhưng nó tạo ra đầu ra khó sử dụng (nhị phân nhiều GB) và không thể hỗ trợ toàn bộ ngôn ngữ. HHVM là một dự án kế tiếp chia sẻ một số mã giống nhau, nhưng không phải là trình biên dịch. HHVM là một máy ảo. Facebook không còn hỗ trợ HipHop.
Andrea

11

Ngoài ra còn có

nhằm mục đích

  • Để mã hóa toàn bộ tập lệnh trong một ứng dụng PHP độc quyền
  • Để mã hóa một số lớp và / hoặc các hàm trong một ứng dụng PHP độc quyền
  • Để cho phép sản xuất các ứng dụng php-gtk có thể được sử dụng trên máy tính để bàn của khách hàng mà không cần php.exe.
  • Để thực hiện nghiên cứu khả thi cho trình chuyển đổi PHP sang C

Phần mở rộng có sẵn từ PECL.


8

phc cho phép bạn biên dịch các chương trình PHP vào các thư viện dùng chung, có thể được tải lên máy chủ. Chương trình PHP được biên dịch thành nhị phân. Nó được thực hiện theo cách để hỗ trợ evals, includes và toàn bộ thư viện chuẩn PHP.


8

Nếu bạn chỉ đơn giản là đang tìm cách tạo ra một tệp thực thi nhị phân từ tập lệnh PHP, thì vui lòng tránh cố gắng làm cho câu hỏi của bạn cực kỳ chính xác bởi vì nó sẽ làm cho nó xuất hiện rằng bạn biết chính xác những gì bạn cần. Bên cạnh đó, hầu hết các nhà phát triển PHP hoàn toàn không có manh mối nào về mã byte là gì.

Với những gì đã nói, câu trả lời là . Tôi vừa hoàn thành việc biên dịch một tập lệnh PHP thành một tệp nhị phân. Và không chỉ bất kỳ nhị phân. Tôi đã sử dụng ứng dụng CDE (liên kết đến Wayback Machine, liên kết ban đầu đã bị hỏng) để biến nó thành một nhị phân di động có thể được phân phối với tất cả các phụ thuộc và được thực hiện mà không gặp vấn đề gì và nó hoạt động rất đẹp.

Tất cả bạn cần là sử dụng phc .


7

Ừm, có ai nghe nói về Zend Guard , nơi thực hiện chính xác những gì người này đang hỏi. Nó mã hóa / làm xáo trộn mã PHP thành "mã máy".


1
Tôi không nghĩ rằng họ muốn obfuscation nhiều như việc tăng tốc do xen kẽ mã byte thay vì nguồn.
Stephen

@Stephen Zend Guard cũng có nghĩa là làm điều đó.
Gajus

Zend Guard đã quyết định không hỗ trợ PHP 7 đó là nhược điểm - blog.zend.com/2016/10/10/zend-guard-and-php-7/#.W7YISnszaM8
vj

2

Có một số "trình biên dịch" mã PHP. Hầu hết trong số chúng không hỗ trợ tất cả các tính năng của PHP, vì các tính năng này đơn giản phải được diễn giải trong thời gian chạy.

Chúng tôi đang sử dụng Phalanger - http://www.php-compiler.net/ - hỗ trợ ngay cả những tính năng động PHP bẩn thỉu này và vẫn có thể biên dịch chúng dưới dạng .NET assembly, có thể được phân phối dưới dạng DLL độc lập.



1

Trong php 7 có tùy chọn php ini opcache.file_cache lưu mã byte trong một thư mục cụ thể. In có thể hữu ích trong tập lệnh php cli được "biên dịch" và lưu trong một thư mục cụ thể để tái sử dụng được tối ưu hóa.

Opcache nó không được biên dịch nhưng là một cái gì đó tương tự.


"Trong php 7" không chỉ có PHP7, đó là PHP 5.5.0 trở lên
Raymond Nijland

0

PHP không thực sự được biên dịch như với nhiều chương trình. Bạn có thể sử dụng bộ mã hóa của Zend để làm cho nó không thể đọc được.


không phải nó được biên dịch theo cùng một cách mà perl được biên dịch sao?
Carson Myers

Tôi tin rằng PHP được biên dịch trên máy chủ. Tôi đã sử dụng một bộ mã hóa để ẩn mã nguồn. Nếu đó là những gì bạn lo lắng. Họ làm việc rất tốt.
Joe

không, tôi chỉ quan tâm đến khía cạnh lý thuyết của nó
Carson Myers

2
PHP không được tuân thủ, đó là một ngôn ngữ được giải thích. bộ đệm chứa 'opcodes' whitch phiên dịch php (không phải đọc văn bản), mã php có thể được 'chạy' trực tiếp như bạn làm với c
borrel

0

Nếu bạn được phép chạy nhị phân gốc, thì đây là trình biên dịch của bạn:

https://github.com/ircmaxell/php-compiler

Đó là một trình biên dịch PHP được viết bằng PHP!

Nó biên dịch mã PHP thành mã VM của riêng nó. Mã VM này sau đó có thể được thông dịch bởi trình thông dịch riêng của nó (cũng được viết bằng PHP, không phải là điên sao?) Hoặc nó có thể được dịch sang Bitcode. Và bằng cách sử dụng khung trình biên dịch LLVM ( clangvà đồng), Bitcode này có thể được biên dịch thành nhị phân riêng cho bất kỳ nền tảng nào mà LLVM hỗ trợ (gần như bất kỳ nền tảng nào quan trọng hiện nay). Bạn có thể chọn thực hiện điều đó một cách tĩnh hoặc mỗi lần ngay trước khi mã được thực thi (kiểu JIT). Vì vậy, hai yêu cầu duy nhất để trình biên dịch này hoạt động trên hệ thống của bạn là trình thông dịch PHP đã cài đặt và clangtrình biên dịch được cài đặt .

Nếu bạn không được phép chạy nhị phân riêng, bạn có thể sử dụng trình biên dịch ở trên làm trình thông dịch và để nó diễn giải mã VM của chính nó, tuy nhiên điều này sẽ chậm khi bạn đang chạy trình thông dịch PHP đang chạy trên công cụ PHP, vì vậy bạn có một "giải thích kép".


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.