> 백엔드 개발 > PHP 튜토리얼 > [php 확장 개발 및 임베디드] 4장 - 빌드 환경 설치

[php 확장 개발 및 임베디드] 4장 - 빌드 환경 설치

黄舟
풀어 주다: 2023-03-05 16:12:01
원래의
1078명이 탐색했습니다.

빌드 환경 설치

이제 적어도 하나의 PHP가 설치되어 있고 이를 웹 기반 애플리케이션 개발에 사용하고 있을 것입니다. php.Net에서 win32 빌드를 다운로드하여 실행했을 것입니다. iis 또는 Windows용 Apache를 사용하거나 *nix(Linux, bsd 또는 기타 POSIX 호환 배포판) 배포판의 패키지 관리 시스템을 사용하여 타사에서 생성한 바이너리를 설치합니다.

php 빌드

소스 코드 패키지를 다운로드하여 직접 컴파일하지 않으면 몇 가지 지식 포인트를 놓칠 수 있습니다.

*nix 도구

C 개발자 도구 세트의 첫 번째 필수 도구는 C용 컴파일러입니다. 배포판에는 기본적으로 하나가 포함되어 있을 수 있으며, 운이 좋다면 gcc(GNU Compiler Collection)가 될 것입니다. 설치된 컴파일러 버전 정보.

컴파일러가 설치되어 있지 않은 경우 사용 중인 배포판에서 지정한 공식 방식으로 gcc를 다운로드하여 설치할 수 있습니다. 일반적으로 이는 rpm 또는 .deb를 다운로드하는 것을 의미합니다. 파일을 다운로드하고 명령을 실행하여 설치하십시오. 이는 사용 중인 배포 버전에 따라 다르며, 다음 명령을 사용하여 간단히 설치할 수 있습니다: urrpmi gcc, apt-get install gcc, pkg-add -r gcc ,erge gcc.

컴파일러 외에도 make, autoconf, automake, libtool과 같은 프로그램과 도구가 필요합니다. 이러한 도구는 사용 중인 배포판의 패키지 관리 시스템을 사용하여 설치할 수도 있습니다. gcc를 설치할 때와 동일하거나, gnu.org에서 직접 소스 패키지를 다운로드하여 직접 컴파일하세요.

권장 버전은 libtool 1.4.3, autoconf 2.13, automake 1.4 또는 1.5입니다. 소프트웨어를 사용할 수도 있습니다. 매우 잘 작동할 수 있지만 이러한 버전은 장기간 사용을 통해 검증되었습니다.

CVS를 사용하여 최신 PHP 개발 버전 코드를 확인하려면 bison도 필요합니다. 및 flex를 사용하여 언어 해석기 및 기타 패키지를 구성합니다. 마찬가지로 이 두 패키지는 배포판의 패키지 관리 시스템을 사용하여 설치하거나 gnu.org에서 소스 코드를 다운로드하여 직접 컴파일할 수 있습니다.

CVS를 선택하려면 cvs 클라이언트도 설치해야 합니다. 마찬가지로 배포판에 이미 설치되어 있을 수도 있고 다른 패키지와 달리 이 패키지를 cvshome.org에서 다운로드해야 합니다.

Win32 도구

번역 Windows 환경이 익숙하지 않으시면 건너뛰세요.

PHP 소스코드 받기

PHP를 다운로드하실 때 첫째, 배포판에서 지원하는 경우 apt를 사용할 수 있습니다. get source php5와 같은 명령을 사용하여 다운로드할 수 있습니다. 이 방법의 장점은 사용 중인 배포 버전에 PHP 소스 수정이 필요한 몇 가지 문제가 있을 수 있다는 것입니다. 여기에서 다운로드하면 이러한 문제가 패치되어 빌드가 존재할 수 있습니다. 단점은 대부분의 배포가 공식 PHP 릴리스보다 몇 주 지연된다는 것입니다.

또 다른 옵션은 php-x.y.z.tar.gz를 다운로드하는 것입니다(www.php.net의 x.y.z는 현재 릴리스 버전입니다). 이 PHP 릴리스는 전 세계 수많은 PHP 사용자에 의해 테스트되었으며 최신 버전입니다.

snaps.php.net에서 스냅 패키지를 다운로드할 수도 있습니다. PHP 저장소에 있는 모든 소스 코드의 최신 버전은 PHP 핵심 개발자의 특정 커밋으로 인해 패키지화될 수 있습니다. 일시적으로 사용할 수 없지만 공식 출시 전에 최신 PHP 6.0 기능이 필요한 경우 여기가 가장 쉽게 구할 수 있는 곳입니다.

마지막으로 cvs를 사용하여 PHP 커널에서 사용하는 개발 버전을 직접 얻을 수 있습니다. 개발 팀이 확장 기능과 임베디드 프로그램을 개발하려는 경우 공식 릴리스 패키지를 사용하고 스냅샷을 얻는 것과 비교할 때 이는 아무런 이점도 없습니다. 그러나 확장 기능이나 기타 애플리케이션을 CVS 라이브러리에 게시하려는 경우에는 그렇지 않습니다. 체크아웃 프로세스에 익숙해지면 여전히 유용합니다.

주석: PHP는 현재 Git 코드 라이브러리를 사용하여 관리되므로 cvs 체크아웃에 대해 자세히 설명하지 않겠습니다. https://github.com/php를 방문하세요. /php-src를 사용하여 최신 소스 코드를 얻을 수 있습니다. PHP에 코드를 기여하고 싶다면 프로젝트 홈페이지에서 소개를 확인하세요.

개발을 위한 PHP 구성

저희는 확장 기능을 개발하거나 다른 PHP 응용 프로그램을 사용하려는 경우 1장에서 설명했듯이 개발자 친화적인 PHP 스위치를 구축할 때 사용해야 하는 두 가지 특별한 ./configure 스위치가 있습니다. 이 두 스위치는 다른 스위치와 함께 사용해야 합니다. PHP를 빌드할 때 사용하세요.

enable-debug

는 PHP 및 zend 소스 트리 디버깅의 특정 주요 기능에서 활성화됩니다. 먼저 각 요청 후에 메모리 누수 보고를 활성화합니다. 🎜>3장 "메모리 관리"를 떠올려 보면 ZendMM은 각 요청에 의해 할당된 메모리를 암시적으로 해제하지만 새로 개발된 코드에 대해 일련의 회귀 테스트 사례를 실행하여 해제된 메모리를 해제합니다. 포인트는 쉽게 노출되어 릴리스 간에 패치될 수 있습니다. 다음 코드 조각을 살펴보겠습니다.

void show_value(int n)  
{  
    char *message = emalloc(1024);  
  
    sprintf(message, "The value of n is %d\n", n);  
    php_printf("%s", message);  
}
로그인 후 복사

이 어리석은 코드가 PHP 요청 실행 중에 실행되면 1024바이트가 누출됩니다. 일반적으로 ZendMM은 스크립트 실행이 끝난 후에 이를 해제합니다.

활성화-디버그 활성화되면 개발자에게 문제를 찾기 위한 오류 메시지가 제공됩니다:

/cvs/php5/ext/sample/sample.c(33) :  Freeing 0x084504B8 (1024 bytes), script=-  
=== Total 1 memory leaks detected ===
로그인 후 복사

이 짧지만 완전한 메시지는 ZendMM이 메모리를 더럽힌 후 정리되었음을 알려주고 블록이 할당된 위치에서 누출된 메모리를 제공합니다. 이 정보를 사용하면 문제를 찾고, 파일을 열고, 해당 라인을 찾고, efree(메시지)를 추가하는 것이 쉽습니다. ) 기능이 끝나기 전 적절한 위치에.

当然, 内存泄露并不是你会碰到的唯一难以追查的问题. 有时候, 问题是潜在的, 很少显现. 比如你通宵达旦的工作, 修改了很多的代码和源文件, 当所有事情做完后, 你自信的执行了make, 测试了一个简单的脚本, 接着就看到了下面的输出:

$ sapi/cli/php -r 'myext_samplefunc();'  
Segmentation Fault
로그인 후 복사

这只是表象, 那问题出在哪里呢? 查看你的myext_samplefunc()实现, 并没有显示出什么明显的线索, 使用gdb运行仅显示出一串未知的符号.

同样, enable-debug会帮到你. 通过在./configure时增加这个开关, 结果的php二进制将包含所有gdb以及其他core文件检查程序所需的调试符号, 这样可以显示出问题出在哪里.

使用这个选项重新构建, 通过gdb触发崩溃, 你现在可以看到下面的输出:

#0 0x1234567 php_myext_find_delimiter(str=0x1234567 "foo@#(FHVN)@\x98\xE0...",  
                                      strlen=3, tsrm_ls=0x1234567)  
    p = strchr(str, ',');
로그인 후 복사

目标就变得清晰了. str字符串并不是NULL终止的, 后面的垃圾可以证明这一点, 而非二进制安全的函数使用了它. strchr()实现尝试从头到尾的扫描传入的str, 但由于没有终止NULL字节, 它到达了不属于它的内存, 这就导致了段错误. 我们可以使用memchr()和strlen参数来修复这个问题防止崩溃.

enable-mantainer-zts

这个选项强制php构建启用线程安全资源管理(TSRM)/Zend线程安全(ZTS)层. 这个开关会增加处理时的复杂度, 但是对于开发者而言, 你会发现这是一件好事情. 关于ZTS的详细介绍以及为什么在开发时要开启这个选项, 请参考第一章.

enable-embed

如果你要开发一个嵌入php的其他应用, 就需要另外一个非常重要的开关. 这个开关打开后就会构建出一个类似开启了with-apxs后构建出的mod_php5.so动态链接库: libphp5.so, 它可以用于将php嵌入到其他应用中.

在Unix上编译

现在你已经有了所有需要的工具, 下载了php源码包, 认识了所有需要的./configure开关, 是时候真正的编译php了.

这里假设你下载的是php-5.1.0.tar.gz, 放在了你的主目录, 你将使用下面的命令序列解包源码包, 并切换到解压出的源码目录:

[/home/sarag]$ tar -zxf php-5.1.0.tar.gz  
[/home/sarag]$ cd php-5.1.0
로그인 후 복사

如果你使用的不是gnu的tar, 命令可能需要略作修改:

[/home/sarag]$ gzip -d php-5.1.0.tar.gz | tar -xf -
로그인 후 복사

现在, 用所需的开关和其他你想要开启或禁用的选项, 执行./configure命令:

[/home/sarag/php-5.1.0]$ ./configure enable-debug \  
enable-maintainer-zts disable-cgi enable-cli \  
disable-pear disable-xml disable-sqlite \  
without-mysql enable-embed
로그인 후 복사

在一段时间的处理后, 在你的屏幕上输出了很多的信息, 最终完成了./configure阶段. 接下来你就可以开始编译了:

[/home/sarag]$ make all install
로그인 후 복사

现在, 站起来喝杯咖啡吧. 编译的时间在性能高的机器上可能需要几分钟, 在旧的486上甚至可能需要半个小时. 构建处理完成后, 你就拥有了一个正确配置, 功能完整, 可用于开发的php.

在Win32上编译

译者不熟悉windows环境, 因此略过.

小结

现在php已经以正确的选项安装了, 你已经准备好开发一个真实的, 有功能的扩展了. 后面的章节, 就开始剖析php扩展. 即便你只计划将php嵌入到你的应用中, 而不对语言做任何扩展, 你也应该阅读这些章节, 因为它详细解释了php的运行机制.

以上就是 [翻译][php扩展开发和嵌入式]第4章-安装构建环境的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿