이진 파일 패키징

webman은 프로젝트를 하나의 이진 파일로 패키징할 수 있어, PHP 환경 없이도 Linux에서 실행할 수 있습니다.

주의
패키징된 파일은 현재 x86_64 아키텍처 Linux에서만 실행되며, Windows와 Mac을 지원하지 않습니다.
php.ini에서 phar 설정을 비활성화해야 합니다. phar.readonly = 0으로 설정하세요.

명령줄 도구 설치

composer require webman/console

패키징

다음 명령을 실행합니다

php webman build:bin

특정 PHP 버전으로 패키징할 수도 있습니다. 예:

php webman build:bin 8.1

패키징 후 build 디렉터리에 webman.bin 파일이 생성됩니다.

시작

webman.bin을 Linux 서버에 업로드한 뒤 ./webman.bin start 또는 ./webman.bin start -d로 시작합니다.

원리

  • 먼저 로컬 webman 프로젝트를 phar 파일로 패키징합니다
  • 그다음 php8.x.micro.sfx를 원격에서 다운로드합니다
  • php8.x.micro.sfx와 phar 파일을 이어서 하나의 이진 파일로 만듭니다

주의사항

  • 호환성 문제를 피하려면 로컬과 패키징에 같은 PHP 버전(예: 둘 다 PHP 8.1) 사용을 권장합니다
  • 패키징 시 PHP 8 소스가 다운로드되지만 로컬에 설치되지 않아, 로컬 PHP 환경에 영향을 주지 않습니다
  • webman.bin은 현재 x86_64 Linux에서만 동작하며 Mac을 지원하지 않습니다
  • 패키징된 프로젝트는 reload를 지원하지 않으며, 코드 수정 시 재시작이 필요합니다
  • 기본적으로 env 파일은 패키징되지 않습니다(config/plugin/webman/console/app.php의 exclude_files로 제어). 시작 시 env 파일은 webman.bin과 같은 디렉터리에 두어야 합니다
  • 실행 중 webman.bin 디렉터리에 runtime 디렉터리가 생성되어 로그를 저장합니다
  • 현재 webman.bin은 외부 php.ini를 읽지 않습니다. php.ini를 수정하려면 config/plugin/webman/console/app.php의 custom_ini에 설정하세요
  • 패키징할 필요가 없는 파일은 config/plugin/webman/console/app.php에서 제외해 패키지 크기를 줄일 수 있습니다
  • 이진 패키징은 Swoole 코루틴을 지원하지 않습니다
  • 사용자가 업로드한 파일을 이진 패키지 안에 저장하지 마세요. phar:// 프로토콜로 업로드 파일을 다루면 phar 역직렬화 취약점 때문에 위험합니다. 업로드 파일은 패키지 밖 디스크에 따로 저장해야 합니다
  • public 디렉터리에 업로드가 필요하다면, public 디렉터리를 webman.bin과 같은 위치에 두고, config/app.php에 아래처럼 설정한 뒤 다시 패키징하세요:
    'public_path' => base_path(false) . DIRECTORY_SEPARATOR . 'public',

정적 PHP 개별 다운로드

전체 PHP 환경 없이 PHP 실행 파일만 필요한 경우, 정적 PHP 다운로드를 사용하세요.


정적 PHP에 php.ini를 지정하려면: php -c /your/path/php.ini start.php start -d

지원 확장 모듈

apcu, bcmath, bz2, calendar, Core, ctype, curl, date, dba, dom, event, exif, fileinfo, filter, ftp, gd, gmp, hash, iconv, imagick, imap, intl, json, libxml, mbstring, mysqli, mysqlnd, openssl, pcntl, pcre, PDO, pdo_mysql, pgsql, Phar, posix, protobuf, readline, redis, Reflection, session, shmop, SimpleXML, soap, sockets, sodium, SPL, sqlite3, standard, swoole, sysvmsg, sysvsem, sysvshm, tokenizer, xml, xmlreader, xmlwriter, xsl, Zend OPcache, zip, zlib

프로젝트 출처

https://github.com/crazywhalecc/static-php-cli
https://github.com/walkor/static-php-cli