PHP가 서버에서 실행되기 전에 바이트 코드로 컴파일 된 다음 해당 바이트 코드를 캐시 할 수 있으므로 전체 스크립트를 모든 웹 액세스로 다시 해석 할 필요가 없습니다.
그러나 PHP 코드를 "컴파일"하고 바이너리 코드 파일을 업로드 할 수 있습니까?이 코드는 바이트 코드 인터프리터에 의해 실행될 것입니까?
PHP가 서버에서 실행되기 전에 바이트 코드로 컴파일 된 다음 해당 바이트 코드를 캐시 할 수 있으므로 전체 스크립트를 모든 웹 액세스로 다시 해석 할 필요가 없습니다.
그러나 PHP 코드를 "컴파일"하고 바이너리 코드 파일을 업로드 할 수 있습니까?이 코드는 바이트 코드 인터프리터에 의해 실행될 것입니까?
답변:
이 질문을받은 후 Facebook은 현재까지 가장 테스트 된 PHP 컴파일러 인 HipHop for PHP 를 출시했습니다 (세계 10 대 웹 사이트 중 하나를 실행 한 것으로 보임). 그러나 페이스 북은 컴파일러가 아닌 가상 머신 인 HHVM을 선호하여 중단했습니다.
그 외에도 인터넷 검색 PHP compiler
은 수많은 타사 솔루션을 제공합니다.
bcompiler_write_exe_footer()
manual 참조 )짧은 대답은 "아니오"입니다.
현재 PHP의 구현은 해석 된 언어의 구현입니다. 모든 언어가 기술적으로 해석되거나 컴파일 될 수 있다는 사실의 이론적 인 측면을 논할 수 있지만, 현재 구현은 PHP 코드가 인터프리터를 실행하고 인터프리터가 실행 환경을 관리하는 방식입니다.
사전 컴파일 된 PHP 바이트 코드 업로드에 대한 질문에 대답하려면 가능할 수도 있지만 PHP 인터프리터가 해당 파일을 읽고 작업 할 수있는 방법을 구현해야합니다. 기존 opcode 캐시가 이미 있으면 많은 보상을 얻는 작업처럼 보이지 않습니다.
include
및에서 제대로 작동합니까 require
? 예를 들어, PHP 스크립트가 보통 포함되어 있다면 include( 'controller/' . $controller_name . '.php' )
HipHop과 자동으로 작동합니까? 건배
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는 그다지 중요하지 않습니다.
질문이 처음으로 제기 된 이후로, "아니오"에서 "종류"로 답변이 변경되었습니다.
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
pre-analyze
PHP 코드에서 가능합니다 . 결과적으로 바이너리 캐시 파일이 생성됩니다. 이 파일과 올바른 HHVM 구성을 사용하면 바이트 코드로만 웹 페이지를 실행할 수 있으며 소스 파일이 더 이상 필요하지 않습니다.
도 있습니다
어느 목표
- 독점 PHP 응용 프로그램에서 전체 스크립트를 인코딩하려면
- 독점 PHP 응용 프로그램에서 일부 클래스 및 / 또는 함수를 인코딩하려면
- php.exe없이 클라이언트 데스크톱에서 사용할 수있는 php-gtk 응용 프로그램을 제작할 수 있습니다.
- PHP에서 C 로의 변환기에 대한 타당성 조사를 수행하려면
확장은 PECL에서 사용할 수 있습니다.
PHP 스크립트에서 바이너리 실행 파일을 생성하려는 경우 질문을 정확하게 이해하지 마십시오. 필요한 내용을 정확하게 알고있는 것처럼 보이기 때문입니다. 게다가 대부분의 PHP 개발자는 바이트 코드가 무엇인지 전혀 모른다.
그렇게 말하면 대답은 ' 예' 입니다. 방금 PHP 스크립트를 바이너리로 컴파일했습니다. 그리고 이진 만이 아닙니다. CDE 응용 프로그램 을 사용했습니다 ( 원래 링크 인 Wayback Machine 링크). 지금 고장) 모든 종속성을 배포하고 문제없이 실행 할 수있는 휴대용 진로를 설정하는 ... 그리고 그것을 아름답게 작동합니다.
음, 누구든지 Zend Guard에 대해 들었습니다 . PHP 코드를 "기계 코드"로 인코딩 / 난독 처리합니다.
PHP 코드에는 몇 가지 "컴파일러"가 있습니다. 대부분은 PHP 기능을 모두 지원하지는 않습니다. 런타임 중에 단순히 해석해야하기 때문입니다.
우리는 Phalanger ( http://www.php-compiler.net/)를 사용 하고 있는데, 이는 더러운 PHP 동적 기능도 지원하고 여전히 독립형 DLL로 배포 할 수있는 .NET 어셈블리로 컴파일 할 수 있습니다.
통합 된 OPcache 모듈로 5.5.x를 참조하십시오. 공유 메모리에 휘발성이 있으며 훨씬 더 많은 성능과 PHP의 역 동성 원칙은 그대로 남아 있습니다.
PHP 7에는 바이트 코드를 특정 폴더에 저장하는 php ini 옵션 opcache.file_cache 가 있습니다. "컴파일"되어 최적화 된 재사용을 위해 특정 폴더에 저장된 PHP cli 스크립트에서 유용 할 수 있습니다.
Opcache는 컴파일되지 않지만 비슷한 것입니다.
PHP는 많은 프로그램 에서처럼 실제로 컴파일되지 않습니다. Zend의 인코더를 사용하여 읽을 수 없도록 만들 수 있습니다.
실제 네이티브 바이너리를 실행할 수 있다면 이것이 컴파일러입니다.
https://github.com/ircmaxell/php-compiler
PHP로 작성된 PHP 컴파일러 입니다!
PHP 코드를 자체 VM 코드로 컴파일합니다. 그런 다음이 VM 코드는 자체 인터프리터 (PHP로 작성되었지만 그렇게 크지 않습니까?)로 해석되거나 비트 코드로 변환 될 수 있습니다. 그리고 LLVM 컴파일러 프레임 워크 ( clang
및 co)를 사용하여이 비트 코드는 LLVM이 지원하는 모든 플랫폼 (오늘날 중요한 거의 모든 플랫폼)의 기본 바이너리로 컴파일 될 수 있습니다. 정적으로 또는 코드가 실행되기 직전 (JIT 스타일)마다 수행하도록 선택할 수 있습니다. 따라서이 컴파일러가 시스템에서 작동하는 데 필요한 두 가지 요구 사항은 설치된 PHP 인터프리터와 설치된 clang
컴파일러입니다.
네이티브 바이너리를 실행할 수 없다면 위의 컴파일러를 인터프리터로 사용하고 자체 VM 코드를 해석하도록 할 수는 있지만 PHP 엔진에서 실행되는 PHP 인터프리터를 실행하면 느려질 수 있습니다. "이중 해석"이 있습니다.