คุณสามารถ“ คอมไพล์” โค้ด PHP และอัปโหลดไฟล์ไบนารี่ - อิชซึ่งจะถูกเรียกใช้โดยล่ามรหัสไบต์?


224

ฉันรู้ว่า PHP ถูกคอมไพล์ไปยังโค้ดไบต์ก่อนที่จะรันบนเซิร์ฟเวอร์จากนั้นโค้ดไบต์สามารถถูกแคชเพื่อให้สคริปต์ทั้งหมดไม่จำเป็นต้องตีความอีกครั้งกับการเข้าถึงเว็บทุกครั้ง

แต่คุณสามารถ "คอมไพล์" โค้ด PHP และอัปโหลดไฟล์ binary-ish ซึ่งเพิ่งจะทำงานโดยล่ามรหัสไบต์?


คำถามที่เกี่ยวข้อง: PHP คอมไพเลอร์สำหรับ Windows
Palec

3
กรุณาอย่าแท็กนี้กับhhvmมิได้ฮิปฮอป HHVM ไม่ได้เป็นส่วนหนึ่งของคำถาม แต่เป็นเพียงคำตอบที่เป็นไปได้ meta.stackexchange.com/a/149347/238706
Palec

@HalayemAnis ฉันคิดว่าคุณพูดถึงลิงค์ผิด .. หรือพวกอัพเดทล่าสุด?
CJ Ramki

@CJRamki ขออภัยโปรดใช้ลิงก์นี้COMPILE_PHP
Halayem Anis

คำถามนี้ค่อนข้างคลุมเครือ คุณสามารถ "เรียบง่าย" สร้างคอมไพเลอร์ PHP ที่คอมไพล์ (ตามความหมายเต็ม) ซอร์สโค้ดและล่าม PHP ใน ELF, EXE หรืออะไรก็ตาม
เซบาสเตียนมัค

คำตอบ:


234

หลังจากถามคำถามนี้ Facebook ได้เปิดตัวHipHop สำหรับ PHPซึ่งน่าจะเป็นคอมไพเลอร์ PHP ที่ผ่านการทดสอบที่ดีที่สุดจนถึงปัจจุบัน อย่างไรก็ตาม Facebook หยุดให้บริการแก่ HHVM ซึ่งเป็นเครื่องเสมือนไม่ใช่คอมไพเลอร์

นอกเหนือจากนั้น googling ยังPHP compilerเปิดใช้งานโซลูชันของบุคคลที่สามอีกจำนวนมาก

พายลูกพีช

  • PeachPie GitHub
  • คอมไพล์ PHP เป็น. NET และ. NET Core
  • สามารถรวบรวมเป็นไฟล์ไบนารีในตัวเอง
  • ทำงานบน Mac, Linux, Windows, Windows Core, ARM, ...

Phalanger

  • GitHub (ดาวน์โหลด) Wikipedia
  • compiles to .NET (CIL) ดูเหมือนจะหยุดผลิตตั้งแต่เดือนกรกฎาคม 2560 และดูเหมือนจะไม่รองรับ PHP 7

PHC

  • รวบรวมไปยังไบนารีพื้นเมือง
  • ไม่ได้ใช้งานมากในขณะนี้ (กุมภาพันธ์ 2014) - รุ่นล่าสุดในปี 2011 การเปลี่ยนแปลงครั้งล่าสุดในฤดูร้อนปี 2013

Roadsend PHP Compiler

bcompiler

  • ส่วนขยาย PECL ของ PHP
  • การทดลอง
  • คอมไพล์ไปยัง PHP bytecode แต่สามารถห่อในไบนารี Windows ที่โหลดล่าม PHP (ดูbcompiler_write_exe_footer()คู่มือ )
  • ดูหยุดแล้วตอนนี้ (กุมภาพันธ์ 2014) - การเปลี่ยนแปลงครั้งสุดท้ายในปี 2011

โครงการศูนย์

  • Wikipedia , IBM
  • ศูนย์บ่มเพาะการเปลี่ยนแปลงสำหรับWebSphere sMash
  • สนับสนุนโดย IBM
  • คอมไพล์ไปยัง Java bytecode
  • ดูเหมือนจะหยุดตอนนี้ (กุมภาพันธ์ 2014) - เว็บไซต์ถูกลงมาดูเหมือนกับโฆษณาขนาดใหญ่ในปี 2008 และ 2009

Bambalam

  • คอมไพล์ไปยังไบนารี Windows แบบสแตนด์อโลน
  • ไบนารีมี bytecode และตัวเรียกใช้งาน
  • ดูหยุดแล้วตอนนี้ (กุมภาพันธ์ 2014) - การเปลี่ยนแปลงครั้งสุดท้ายในปี 2549

BinaryPHP

  • คอมไพล์เป็น C ++
  • ดูหยุดแล้วตอนนี้ (กุมภาพันธ์ 2014) - การเปลี่ยนแปลงครั้งสุดท้ายในปี 2003

แล้วเว็บโฮสต์ที่ใช้ร่วมกันล่ะ ฉันสามารถรวบรวมสคริปต์ PHP ของฉันกับหนึ่งในคอมไพเลอร์เหล่านั้นแล้วอัปโหลดไปยังโฮสต์เว็บที่ใช้ Linux ของฉันได้หรือไม่
SaidbakR

2
@ sємsємมันขึ้นอยู่กับโฮสต์ของคุณ แต่ถ้าฉันต้องเดาฉันเดาได้ว่าหลายครอบครัวคงไม่อนุญาต
Frank Farmer

2
ดูเหมือนว่าโครงการดังกล่าวจะไม่ได้รับการดูแลรักษาอีกต่อไป มีคอมไพเลอร์ที่ยอมรับกันโดยทั่วไปตั้งแต่ 2 ปีที่ผ่านมาหรือทำไมโครงการเหล่านั้นจึงถูกเพิกเฉย / ถูกทอดทิ้ง?
Preexo

รายการที่ดีของคอมไพเลอร์ PHPที่ thefreecountry.com เครื่องมือทั้งหมดที่กล่าวถึงนั้นรวมอยู่ในคำตอบนี้แล้ว
Palec

1
เนื่องจากสิ่งเหล่านี้ดูเหมือนจะตายคำตอบดูเหมือนจะเป็น "ไม่"
Ira Baxter

22

คำตอบสั้น ๆ คือ "ไม่"

การใช้งานปัจจุบันของ PHP เป็นภาษาที่ตีความ คุณสามารถโต้แย้งแง่มุมทางทฤษฎีของความจริงที่ว่าภาษาใด ๆ ที่สามารถตีความหรือเรียบเรียงในทางเทคนิค แต่เมื่อมันเกิดขึ้นการใช้งานในปัจจุบันเป็นเช่นนั้นรหัส PHP ต้องการล่ามเพื่อให้ทำงานและล่ามจัดการสภาพแวดล้อมการดำเนินการ

เพื่อตอบคำถามของคุณเกี่ยวกับการอัปโหลดโค้ดบีทีโค้ด PHP ที่รวบรวมไว้ล่วงหน้าอาจเป็นไปได้ แต่คุณต้องใช้วิธีสำหรับล่าม PHP เพื่ออ่านไฟล์ดังกล่าวและทำงานกับมัน ด้วย opcode ที่มีอยู่แคชออกไปแล้วมันไม่เหมือนงานที่จะเก็บเกี่ยวรางวัลมากมาย


3
บ่อยครั้งที่คุณต้องการล่ามเพื่อให้สามารถใช้งานโปรแกรม PHP ได้อย่างถูกต้อง แต่นั่นไม่ได้แปลว่าคอมไพเลอร์ไม่สามารถให้รหัสแปลได้ phc (phpcompiler.org) จัดการปัญหาทั้งหมดที่คุณอธิบาย เพื่อความรู้ที่ดีที่สุดของฉัน Roadsend (roadsend.com) ก็ทำเช่นกัน
Paul Biggar

28
คำตอบนี้ล้าสมัย - HipHop เปิดตัว 6 เดือนหลังจากโพสต์ในเดือนกุมภาพันธ์ 2010
Frank Farmer

1
@FrankFarmer คุณเคยมีประสบการณ์กับ HipHop บ้างไหม? ทำงานไม่ถูกต้องกับฮิปฮอปincludeและrequire? ตัวอย่างเช่นหากมีการรวมสคริปต์ PHP ไว้ด้วยโดยinclude( 'controller/' . $controller_name . '.php' )อัตโนมัติจะทำงานกับ HipHop ได้หรือไม่ ไชโย
Lea Hayes

2
จริงๆแล้วคุณสามารถคอมไพล์โค้ด PHP ได้โดยใช้คอมไพเลอร์ PHP ปกติ มันขึ้นอยู่กับแพลตฟอร์มเป้าหมายเท่านั้น คุณสามารถคอมไพล์เป็น opend ของ Zend ภาษา C หรือในแอสเซมบลี. NET (โดยใช้ 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…ไม่มีอะไรในทางทฤษฎีเกี่ยวกับมันภาษาที่แปลมากมายมีคอมไพเลอร์ กล่าวคือ AutoIt / AutoHotkey หรือแม้กระทั่งย้อนกลับไปถึงพื้นฐาน มีโปรแกรมจำนวนมากที่เขียนขึ้นในโปรแกรมเหล่านั้นจากนั้นรวบรวมเพื่อใช้งานโดยสาธารณะเป็นโปรแกรมเดี่ยว ไม่มีอะไรพิเศษเกี่ยวกับ PHP เพื่อป้องกันไม่ให้คอมไพล์ได้ซึ่งเป็นสาเหตุที่มีคอมไพเลอร์จำนวนมาก แต่ต่างจาก AHK ไม่มีคอมไพเลอร์ทางการทดสอบคอมไพเลอร์ — Zend Guard ไม่นับ
Synetech

16

ตั้งแต่คำถามถูกถามครั้งแรกมีการเปลี่ยนแปลงคำตอบนั้นจากคำว่า "ไม่" เป็น "ชนิด"

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

Hip Hop สำหรับ PHP เป็นคอมไพเลอร์ที่ใช้โค้ด PHP และเปลี่ยนเป็น C ++ ที่มีประสิทธิภาพสูงสุดเห็นได้ชัดว่าบางฟังก์ชั่นไม่ได้รับการรองรับ (ตัวอย่างเช่น 'explode')

ฉันพบคำถามนี้ในขณะที่มองหาข้อมูลเพิ่มเติมเกี่ยวกับวิธีการใช้ HipHop และคิดว่าฉันจะพูด :)

อย่างไรก็ตามตั้งแต่ปี 2013 Facebook ไม่ได้ใช้งานอีกต่อไปและถูกยกเลิกเนื่องจาก HHVM ซึ่งไม่ใช่คอมไพเลอร์: https://en.wikipedia.org/wiki/HipHop_for_PHP


3
นี่คือสิ่งที่ Facebook ใช้ฉันเชื่อ
Richard H

"ชนิด" อยู่ในขณะนี้ไม่กี่ปีที่ผ่านมาและเนื่องจาก HHVM (HipHop Php) เริ่มดีขึ้นเรื่อย ๆ ทุกวันจึงมีวิธีที่ดีที่สุด (ฉันคิดว่า) ใช้ HHVM เป็นไปได้ในปัจจุบันpre-analyzeรหัส php เป็นผลให้คุณได้รับไฟล์ไบนารีแคช ด้วยไฟล์นี้และการกำหนดค่า HHVM ที่ถูกต้องจึงเป็นไปได้ที่จะเรียกใช้เว็บเพจด้วย bytecode โดยไม่จำเป็นต้องใช้ไฟล์ต้นฉบับอีกต่อไป;) ฉันหวังว่าฉันเข้าใจถูกต้อง
PKeidel

@Andrea คุณหมายถึงอะไรโดย HHVM ที่ถูกปฏิเสธ? ดูเหมือนจะได้รับการดูแลและมีชีวิตเหมือนโครงการ หรือคุณหมายถึงชื่อเปลี่ยนจาก Hip Hop สำหรับ PHP เป็น HHVM? จากนั้นการพูดถึงการเลิกใช้งานนั้นทำให้เข้าใจผิด
Palec

1
@Palec HipHop สำหรับ PHP ถูกยกเลิก มันเป็นคอมไพเลอร์ PHP-to-C ++ ที่ Facebook ใช้ แต่มันสร้างเอาท์พุทที่เทอะทะ (ไบนารีหลายกิกะไบต์) และไม่รองรับภาษาเต็มรูปแบบ HHVM เป็นโครงการที่สืบทอดซึ่งใช้รหัสเดียวกันบางส่วน แต่ไม่ใช่คอมไพเลอร์ HHVM เป็นเครื่องเสมือน Facebook ไม่สนับสนุน HipHop อีกต่อไป
Andrea

11

นอกจากนี้ยังมี

ซึ่งมีจุดมุ่งหมาย

  • เพื่อเข้ารหัสสคริปต์ทั้งหมดในแอปพลิเคชัน PHP ที่เป็นกรรมสิทธิ์
  • เพื่อเข้ารหัสคลาสและ / หรือฟังก์ชั่นบางอย่างในแอปพลิเคชัน PHP ที่เป็นกรรมสิทธิ์
  • เพื่อเปิดใช้งานการผลิตแอปพลิเคชัน php-gtk ที่สามารถใช้งานบนเดสก์ท็อปไคลเอ็นต์โดยไม่จำเป็นต้องใช้ php.exe
  • เพื่อทำการศึกษาความเป็นไปได้สำหรับตัวแปลง PHP เป็น C

ส่วนขยายพร้อมใช้งานจาก PECL


8

phcช่วยให้คุณสามารถคอมไพล์โปรแกรม PHP ไปยังไลบรารี่ที่แชร์ซึ่งสามารถอัพโหลดไปยังเซิร์ฟเวอร์ได้ โปรแกรม PHP ถูกคอมไพล์เป็นไบนารี มันทำเพื่อสนับสนุนevals, includes และไลบรารี่มาตรฐาน PHP ทั้งหมด


8

หากคุณกำลังมองหาการสร้างไบนารีที่สามารถเรียกใช้งานได้จากสคริปต์ PHP โปรดอย่าพยายามทำให้คำถามของคุณแม่นยำมากเพราะจะทำให้ดูเหมือนว่าคุณรู้ว่าคุณต้องการอะไร นอกจากนี้นักพัฒนา PHP ส่วนใหญ่ยังไม่มีเบาะแสอย่างแน่นอนเกี่ยวกับสิ่งที่ bytecode คือ

กับที่กล่าวว่าคำตอบคือใช่ ฉันเพิ่งรวบรวมสคริปต์ PHP เป็นไบนารีเสร็จสิ้น และไม่เพียงแค่ไบนารีใด ๆ ฉันได้ใช้แอปพลิเคชัน CDE (ลิงก์ไปยังเครื่อง Wayback ลิงก์เดิมตอนนี้เสียหาย) เพื่อเปลี่ยนเป็นไบนารีแบบพกพาที่สามารถแจกจ่ายกับการอ้างอิงทั้งหมดและดำเนินการได้โดยไม่มีปัญหา ... และทำงานได้อย่างสวยงาม

ทั้งหมดที่คุณต้องการก็คือการใช้PHC


7

อืมไม่มีใครได้ยินZend Guardซึ่งทำสิ่งที่บุคคลนี้ขออย่างแน่นอน มันเข้ารหัส / obfuscates รหัส PHP เป็น "รหัสเครื่อง"


1
ฉันไม่คิดว่าพวกเขาต้องการความงุนงงมากเท่ากับการเพิ่มความเร็วที่เกิดจากการรบกวน bytecode แทนที่จะเป็นแหล่งที่มา
Stephen

@Stephen Zend Guard ก็มีไว้สำหรับทำเช่นนั้นเช่นกัน
Gajus

Zend Guard ตัดสินใจที่จะไม่สนับสนุน PHP 7 ซึ่งเป็นข้อเสียเปรียบ - blog.zend.com/2016/10/10/zend-guard-and-php-7/#.W7YISISzazaM8
vj

2

มี "คอมไพเลอร์" ของโค้ด PHP อยู่หลายตัว ส่วนใหญ่ไม่รองรับฟีเจอร์ PHP ทั้งหมดเนื่องจากสิ่งเหล่านี้จะต้องถูกตีความในช่วงเวลาทำงาน

เรากำลังใช้ Phalanger - http://www.php-compiler.net/ - ที่รองรับแม้แต่ฟีเจอร์ PHP แบบไดนามิกที่สกปรกและยังสามารถคอมไพล์มันเป็น. NET แอสเซมบลีที่สามารถกระจายเป็น DLL แบบสแตนด์อโลน



1

ใน php 7 มีตัวเลือก php ini opcache.file_cacheที่บันทึก bytecode ในโฟลเดอร์เฉพาะ ในอาจเป็นประโยชน์ในสคริปต์ php cli ที่ "รวบรวม" และบันทึกไว้ในโฟลเดอร์เฉพาะสำหรับการใช้ซ้ำที่ดีที่สุด

Opcache มันไม่ได้รวบรวม แต่เป็นสิ่งที่คล้ายกัน


"In php 7" ไม่ใช่ PHP7 เท่านั้นมันคือ PHP 5.5.0 และใหม่กว่า
Raymond Nijland

0

PHP ไม่ได้รับการคอมไพล์เช่นเดียวกับหลาย ๆ โปรแกรม คุณสามารถใช้โปรแกรมเปลี่ยนไฟล์ของ Zend เพื่อทำให้อ่านไม่ได้


มันไม่ได้รับการรวบรวมในลักษณะเดียวกับที่ Perl ได้รับการรวบรวม?
คาร์สันไมเออร์ส

PHP ถูกคอมไพล์บนเซิร์ฟเวอร์ในทันทีที่ฉันเชื่อ ฉันใช้ตัวเข้ารหัสเพื่อซ่อนซอร์สโค้ด หากนั่นคือสิ่งที่คุณเป็นห่วง พวกเขาทำงานได้ดีจริงๆ
Joe

ไม่ฉันเพียงแค่สนใจในด้านทฤษฎีของมัน
Carson Myers

2
PHP ไม่ได้ปฏิบัติตามมันเป็นภาษาที่ตีความ แคชประกอบด้วย 'opcodes' whitch php interprets (ไม่ต้องอ่านข้อความ), โค้ด php ไม่สามารถ 'run' ได้โดยตรงอย่างที่คุณต้องการด้วย c
borrel

0

หากคุณได้รับอนุญาตให้เรียกใช้ไบนารีเนทีฟจริงนี่คือคอมไพเลอร์ของคุณ:

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

มันเป็นคอมไพเลอร์ PHP ที่เขียนด้วย PHP!

มันรวบรวมรหัส PHP เป็นรหัส VM ของตัวเอง รหัส VM นี้สามารถตีความได้โดยล่ามของตัวเอง (เขียนด้วยภาษา PHP ว่าไม่บ้าเหรอ?) หรือสามารถแปลเป็น Bitcode ได้ และด้วยการใช้เฟรมเวิร์กคอมไพเลอร์ LLVM ( clangและ co) บิตโค้ดนี้สามารถรวบรวมเป็นไบนารีเนทีฟสำหรับแพลตฟอร์มใด ๆ ที่ LLVM รองรับ (ค่อนข้างแพลตฟอร์มใด ๆ ที่สำคัญในปัจจุบัน) คุณสามารถเลือกที่จะทำแบบคงที่หรือแต่ละครั้งก่อนที่รหัสจะถูกดำเนินการ (สไตล์ JIT) ดังนั้นข้อกำหนดสองข้อเท่านั้นสำหรับคอมไพเลอร์นี้ที่จะทำงานบนระบบของคุณคือล่าม PHP ที่ติดตั้งและclangคอมไพเลอร์ที่ติดตั้ง

หากคุณไม่ได้รับอนุญาตให้รันไบนารีเนทีฟคุณสามารถใช้คอมไพเลอร์ด้านบนเป็นล่ามและปล่อยให้มันแปลรหัส VM ของตัวเอง แต่สิ่งนี้จะช้าลงเมื่อคุณใช้ล่าม PHP ที่ทำงานบนเอนจิน PHP ดังนั้น คุณมี "การตีความสองครั้ง"


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.