PHP 코드를“컴파일”하고 바이너리 코드 파일을 업로드 할 수 있습니까?이 코드는 바이트 코드 인터프리터에 의해 실행됩니까?


224

PHP가 서버에서 실행되기 전에 바이트 코드로 컴파일 된 다음 해당 바이트 코드를 캐시 할 수 있으므로 전체 스크립트를 모든 웹 액세스로 다시 해석 할 필요가 없습니다.

그러나 PHP 코드를 "컴파일"하고 바이너리 코드 파일을 업로드 할 수 있습니까?이 코드는 바이트 코드 인터프리터에 의해 실행될 것입니까?



3
hhvm 또는 hiphop로 태그를 지정하지 마십시오 . HHVM은 문제의 본질적인 부분이 아니라 가능한 대답입니다. meta.stackexchange.com/a/149347/238706
Palec

@HalayemAnis 잘못된 링크를 언급했다고 생각합니다. 해당 자습서에 대한 올바른 링크를 제공 할 수 있습니까? 또는 최신 업데이트 사람?
CJ Ramki 2016 년

@CJRamki 죄송합니다,이 링크를 사용하십시오 COMPILE_PHP
Halayem Anis

이 질문은 실제로 다소 모호합니다. 소스 코드와 PHP 인터프리터를 ELF, EXE 등으로 컴파일 하는 PHP 컴파일러를 "간단하게"작성할 수 있습니다.
Sebastian Mach

답변:


234

이 질문을받은 후 Facebook은 현재까지 가장 테스트 된 PHP 컴파일러 인 HipHop for PHP 를 출시했습니다 (세계 10 대 웹 사이트 중 하나를 실행 한 것으로 보임). 그러나 페이스 북은 컴파일러가 아닌 가상 머신 인 HHVM을 선호하여 중단했습니다.

그 외에도 인터넷 검색 PHP compiler은 수많은 타사 솔루션을 제공합니다.

복숭아 파이

  • 피치 피 깃 허브
  • PHP를 .NET 및 .NET Core로 컴파일
  • 자체 포함 된 이진 파일로 컴파일 가능
  • Mac, Linux, Windows, Windows Core, ARM에서 실행됩니다 ...

팔랑 게르

  • GitHub (다운로드), Wikipedia
  • .NET (CIL)으로의 컴파일은 2017 년 7 월부터 중단되어 PHP 7을 지원하지 않는 것 같습니다.

phc

  • 네이티브 바이너리로 컴파일
  • 현재 활발하지 않음 (2014 년 2 월) – 2011 년 마지막 버전, 2013 년 여름 마지막 변경

로드 센드 PHP 컴파일러

bcompiler

  • PHP의 PECL 확장
  • 실험적인
  • PHP 바이트 코드로 컴파일하지만 PHP 인터프리터를로드하는 Windows 바이너리로 래핑 할 수 있습니다 ( bcompiler_write_exe_footer()manual 참조 )
  • 단종 된 것으로 보입니다 (2014 년 2 월) – 2011 년 마지막 변경

프로젝트 제로

  • 위키 백과 , IBM
  • WebSphere sMash의 인큐베이터
  • IBM에서 지원
  • Java 바이트 코드로 컴파일
  • (판매 중단) (2014 년 2 월) – 웹 사이트가 다운되어 2008 년과 2009 년에 과대 광고처럼 보입니다.

밤 발람

  • 독립형 Windows 바이너리로 컴파일
  • 바이너리는 바이트 코드와 런처를 포함합니다.
  • 단종 된 것으로 보입니다 (2014 년 2 월) – 2006 년 마지막 변경

이진 PHP

  • C ++로 컴파일
  • 단종 된 것으로 보입니다 (2014 년 2 월) – 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은 2010 년 2 월에 게시 된 지 6 개월 후에 릴리스되었습니다.
Frank Farmer

1
@FrankFarmer HipHop에 대해 경험이 있습니까? HipHop이 include및에서 제대로 작동합니까 require? 예를 들어, PHP 스크립트가 보통 포함되어 있다면 include( 'controller/' . $controller_name . '.php' )HipHop과 자동으로 작동합니까? 건배
레아 헤이스

2
실제로 일반 PHP 컴파일러를 사용하여 PHP 코드를 컴파일 할 수 있습니다. 대상 플랫폼에 따라 다릅니다. Zend opcode, 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…그것에 대해 이론적 인 것은 없으며, 많은 해석 언어에는 컴파일러가 있습니다. viz AutoIt / AutoHotkey 또는 심지어 기본까지 거슬러 올라갑니다. 이 프로그램으로 작성된 많은 프로그램이 있으며 일반인이 독립형 프로그램으로 사용하도록 컴파일되었습니다. 컴파일 할 수 없도록하는 PHP에는 특별한 것이 없기 때문에 많은 컴파일러가 존재하지만 AHK와 달리 공식적으로 테스트 된 컴파일러는 없습니다. Zend Guard는 그다지 중요하지 않습니다.
Synetech

16

질문이 처음으로 제기 된 이후로, "아니오"에서 "종류"로 답변이 변경되었습니다.

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

Hip Hop for PHP는 PHP 코드를 사용하여 최적화 된 C ++로 변환 한 컴파일러였습니다. 분명히 일부 기능은 지원되지 않습니다 (예 : 'explode')

HipHop을 구현하는 방법에 대한 자세한 정보를 찾고이 질문을 찾았으며 내가 생각할 것이라고 생각했습니다. :)

그러나 2013 년 이후 Facebook에서는 더 이상 사용하지 않으며 컴파일러가 아닌 HHVM을 위해 중단되었습니다 : https://en.wikipedia.org/wiki/HipHop_for_PHP


3
이것이 내가 믿는 페이스 북의 용도
Richard H

"종류"는 현재 몇 년 뒤에 있으며 HHVM (HipHop Php)이 매일 점점 좋아지고 있기 때문에 최종적으로 방법이 있습니다 (제 생각에). HHVM을 사용하면 오늘날 pre-analyzePHP 코드에서 가능합니다 . 결과적으로 바이너리 캐시 파일이 생성됩니다. 이 파일과 올바른 HHVM 구성을 사용하면 바이트 코드로만 웹 페이지를 실행할 수 있으며 소스 파일이 더 이상 필요하지 않습니다.
PKeidel

@Andrea, HHVM이 더 이상 사용되지 않는다는 것은 무엇을 의미합니까? 프로젝트처럼 유지되고 생생하게 보입니다. 아니면 이름이 PHP 용 힙합에서 HHVM으로 변경되었다는 의미입니까? 그런 다음 지원 중단에 대해 이야기하는 것은 오해의 소지가 있습니다.
Palec

1
PHP 용 @Palec HipHop이 중단되었습니다. Facebook에서 사용하는 PHP-C ++ 컴파일러 였지만 터무니없는 출력 (멀티 GB 바이너리)을 생성했으며 전체 언어를 지원할 수 없었습니다. HHVM은 동일한 코드 중 일부를 공유하는 후속 프로젝트이지만 컴파일러는 아닙니다. HHVM은 가상 머신입니다. Facebook은 더 이상 HipHop을 지원하지 않습니다.
Andrea

11

도 있습니다

어느 목표

  • 독점 PHP 응용 프로그램에서 전체 스크립트를 인코딩하려면
  • 독점 PHP 응용 프로그램에서 일부 클래스 및 / 또는 함수를 인코딩하려면
  • php.exe없이 클라이언트 데스크톱에서 사용할 수있는 php-gtk 응용 프로그램을 제작할 수 있습니다.
  • PHP에서 C 로의 변환기에 대한 타당성 조사를 수행하려면

확장은 PECL에서 사용할 수 있습니다.


8

phc를 사용하면 PHP 프로그램을 공유 라이브러리로 컴파일하여 서버에 업로드 할 수 있습니다. PHP 프로그램은 바이너리로 컴파일됩니다. evals 및 includes 전체 PHP 표준 라이브러리 를 지원하는 방식으로 수행됩니다 .


8

PHP 스크립트에서 바이너리 실행 파일을 생성하려는 경우 질문을 정확하게 이해하지 마십시오. 필요한 내용을 정확하게 알고있는 것처럼 보이기 때문입니다. 게다가 대부분의 PHP 개발자는 바이트 코드가 무엇인지 전혀 모른다.

그렇게 말하면 대답은 ' 예' 입니다. 방금 PHP 스크립트를 바이너리로 컴파일했습니다. 그리고 이진 만이 아닙니다. CDE 응용 프로그램 을 사용했습니다 ( 원래 링크 인 Wayback Machine 링크). 지금 고장) 모든 종속성을 배포하고 문제없이 실행 할 수있는 휴대용 진로를 설정하는 ... 그리고 그것을 아름답게 작동합니다.

phc 를 사용하기 만하면 됩니다.


7

음, 누구든지 Zend Guard에 대해 들었습니다 . PHP 코드를 "기계 코드"로 인코딩 / 난독 처리합니다.


1
소스가 아닌 바이트 코드가 상호 작용하여 발생하는 속도만큼 난독 화를 원한다고 생각하지 않습니다.
Stephen

@Stephen Zend Guard도 그렇게해야합니다.
Gajus

Zend Guard는 단점 인 PHP 7을 지원하지 않기로 결정했습니다.- blog.zend.com
vj

2

PHP 코드에는 몇 가지 "컴파일러"가 있습니다. 대부분은 PHP 기능을 모두 지원하지는 않습니다. 런타임 중에 단순히 해석해야하기 때문입니다.

우리는 Phalanger ( http://www.php-compiler.net/)를 사용 하고 있는데, 이는 더러운 PHP 동적 기능도 지원하고 여전히 독립형 DLL로 배포 할 수있는 .NET 어셈블리로 컴파일 할 수 있습니다.



1

PHP 7에는 바이트 코드를 특정 폴더에 저장하는 php ini 옵션 opcache.file_cache 가 있습니다. "컴파일"되어 최적화 된 재사용을 위해 특정 폴더에 저장된 PHP cli 스크립트에서 유용 할 수 있습니다.

Opcache는 컴파일되지 않지만 비슷한 것입니다.


"PHP 7에서"이 아니 PHP7 만은 PHP 5.5.0이고 나중에
레이몬드 Nijland

0

PHP는 많은 프로그램 에서처럼 실제로 컴파일되지 않습니다. Zend의 인코더를 사용하여 읽을 수 없도록 만들 수 있습니다.


펄이 컴파일되는 것과 같은 방식으로 컴파일되지 않습니까?
카슨 마이어스

PHP는 내가 믿는 즉시 서버에 컴파일됩니다. 그래도 인코더를 사용하여 소스 코드를 숨겼습니다. 그것이 당신이 걱정하는 것이라면. 그들은 정말 잘 작동합니다.
Joe

아, 나는 그것의 이론적 인 측면에 관심이있었습니다
카슨 마이어스

2
PHP는 해석되지 않은 언어입니다. 캐시에는 'opcodes'가 포함되어 있습니다. PHP가 해석하는 텍스트 (텍스트를 읽을 필요는 없음), PHP 코드는 c와 같이 직접 '실행'할 수 없습니다.
borrel

0

실제 네이티브 바이너리를 실행할 수 있다면 이것이 컴파일러입니다.

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

PHP로 작성된 PHP 컴파일러 입니다!

PHP 코드를 자체 VM 코드로 컴파일합니다. 그런 다음이 VM 코드는 자체 인터프리터 (PHP로 작성되었지만 그렇게 크지 않습니까?)로 해석되거나 비트 코드로 변환 될 수 있습니다. 그리고 LLVM 컴파일러 프레임 워크 ( clang및 co)를 사용하여이 비트 코드는 LLVM이 지원하는 모든 플랫폼 (오늘날 중요한 거의 모든 플랫폼)의 기본 바이너리로 컴파일 될 수 있습니다. 정적으로 또는 코드가 실행되기 직전 (JIT 스타일)마다 수행하도록 선택할 수 있습니다. 따라서이 컴파일러가 시스템에서 작동하는 데 필요한 두 가지 요구 사항은 설치된 PHP 인터프리터와 설치된 clang컴파일러입니다.

네이티브 바이너리를 실행할 수 없다면 위의 컴파일러를 인터프리터로 사용하고 자체 VM 코드를 해석하도록 할 수는 있지만 PHP 엔진에서 실행되는 PHP 인터프리터를 실행하면 느려질 수 있습니다. "이중 해석"이 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.