static-php-cli/en/develop/structure.html
2025-06-19 07:57:56 +00:00

34 lines
35 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Introduction to project structure | static-php-cli</title>
<meta name="description" content="Build single static PHP binary, with PHP project together, with popular extensions included.">
<meta name="generator" content="VitePress v2.0.0-alpha.5">
<link rel="preload stylesheet" href="/assets/style.DzD7Taea.css" as="style">
<link rel="preload stylesheet" href="/vp-icons.css" as="style">
<script type="module" src="/assets/app.B4hLhYRx.js"></script>
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
<link rel="modulepreload" href="/assets/chunks/theme.8dVMQbWa.js">
<link rel="modulepreload" href="/assets/chunks/framework.PeLcR_tw.js">
<link rel="modulepreload" href="/assets/en_develop_structure.md.D1kBTweh.lean.js">
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
</head>
<body>
<div id="app"><div class="Layout" data-v-5e06b97a><!--[--><!--]--><!--[--><span tabindex="-1" data-v-0b0ada53></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-0b0ada53>Skip to content</a><!--]--><!----><header class="VPNav" data-v-5e06b97a data-v-ae24b3ad><div class="VPNavBar" data-v-ae24b3ad data-v-0ae64501><div class="wrapper" data-v-0ae64501><div class="container" data-v-0ae64501><div class="title" data-v-0ae64501><div class="VPNavBarTitle has-sidebar" data-v-0ae64501 data-v-1e38c6bc><a class="title" href="/en/" data-v-1e38c6bc><!--[--><!--]--><!----><span data-v-1e38c6bc>static-php-cli</span><!--[--><!--]--></a></div></div><div class="content" data-v-0ae64501><div class="content-body" data-v-0ae64501><!--[--><!--]--><div class="VPNavBarSearch search" data-v-0ae64501><!----></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-0ae64501 data-v-39714824><span id="main-nav-aria-label" class="visually-hidden" data-v-39714824> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/en/guide/" tabindex="0" data-v-39714824 data-v-e56f3d57><!--[--><span data-v-e56f3d57>Guide</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/en/develop/" tabindex="0" data-v-39714824 data-v-e56f3d57><!--[--><span data-v-e56f3d57>Advanced</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/en/contributing/" tabindex="0" data-v-39714824 data-v-e56f3d57><!--[--><span data-v-e56f3d57>Contributing</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/en/faq/" tabindex="0" data-v-39714824 data-v-e56f3d57><!--[--><span data-v-e56f3d57>FAQ</span><!--]--></a><!--]--><!--]--></nav><div class="VPFlyout VPNavBarTranslations translations" data-v-0ae64501 data-v-88af2de4 data-v-3ab3deac><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="Change language" data-v-3ab3deac><span class="text" data-v-3ab3deac><span class="vpi-languages option-icon" data-v-3ab3deac></span><!----><span class="vpi-chevron-down text-icon" data-v-3ab3deac></span></span></button><div class="menu" data-v-3ab3deac><div class="VPMenu" data-v-3ab3deac data-v-c9afd7f1><!----><!--[--><!--[--><div class="items" data-v-88af2de4><p class="title" data-v-88af2de4>English</p><!--[--><div class="VPMenuLink" data-v-88af2de4 data-v-35975db6><a class="VPLink link" href="/zh/develop/structure.html" data-v-35975db6><!--[--><span data-v-35975db6>简体中文</span><!--]--></a></div><!--]--></div><!--]--><!--]--></div></div></div><div class="VPNavBarAppearance appearance" data-v-0ae64501 data-v-6c893767><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-6c893767 data-v-5337faa4 data-v-1d5665e3><span class="check" data-v-1d5665e3><span class="icon" data-v-1d5665e3><!--[--><span class="vpi-sun sun" data-v-5337faa4></span><span class="vpi-moon moon" data-v-5337faa4></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-0ae64501 data-v-0394ad82 data-v-d474d15f><!--[--><a class="VPSocialLink no-icon" href="https://github.com/crazywhalecc/static-php-cli" aria-label="github" target="_blank" rel="noopener" data-v-d474d15f data-v-bd121fe5><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-0ae64501 data-v-bb2aa2f0 data-v-3ab3deac><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-3ab3deac><span class="vpi-more-horizontal icon" data-v-3ab3deac></span></button><div class="menu" data-v-3ab3deac><div class="VPMenu" data-v-3ab3deac data-v-c9afd7f1><!----><!--[--><!--[--><div class="group translations" data-v-bb2aa2f0><p class="trans-title" data-v-bb2aa2f0>English</p><!--[--><div class="VPMenuLink" data-v-bb2aa2f0 data-v-35975db6><a class="VPLink link" href="/zh/develop/structure.html" data-v-35975db6><!--[--><span data-v-35975db6>简体中文</span><!--]--></a></div><!--]--></div><div class="group" data-v-bb2aa2f0><div class="item appearance" data-v-bb2aa2f0><p class="label" data-v-bb2aa2f0>Appearance</p><div class="appearance-action" data-v-bb2aa2f0><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-bb2aa2f0 data-v-5337faa4 data-v-1d5665e3><span class="check" data-v-1d5665e3><span class="icon" data-v-1d5665e3><!--[--><span class="vpi-sun sun" data-v-5337faa4></span><span class="vpi-moon moon" data-v-5337faa4></span><!--]--></span></span></button></div></div></div><div class="group" data-v-bb2aa2f0><div class="item social-links" data-v-bb2aa2f0><div class="VPSocialLinks social-links-list" data-v-bb2aa2f0 data-v-d474d15f><!--[--><a class="VPSocialLink no-icon" href="https://github.com/crazywhalecc/static-php-cli" aria-label="github" target="_blank" rel="noopener" data-v-d474d15f data-v-bd121fe5><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-0ae64501 data-v-e5dd9c1c><span class="container" data-v-e5dd9c1c><span class="top" data-v-e5dd9c1c></span><span class="middle" data-v-e5dd9c1c></span><span class="bottom" data-v-e5dd9c1c></span></span></button></div></div></div></div><div class="divider" data-v-0ae64501><div class="divider-line" data-v-0ae64501></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-5e06b97a data-v-e30e5487><div class="container" data-v-e30e5487><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-e30e5487><span class="vpi-align-left menu-icon" data-v-e30e5487></span><span class="menu-text" data-v-e30e5487>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-e30e5487 data-v-5fabb9ca><button data-v-5fabb9ca>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-5e06b97a data-v-cbecfdd4><div class="curtain" data-v-cbecfdd4></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-cbecfdd4><span class="visually-hidden" id="sidebar-aria-label" data-v-cbecfdd4> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-8d50c081><section class="VPSidebarItem level-0 has-active" data-v-8d50c081 data-v-d81de50c><div class="item" role="button" tabindex="0" data-v-d81de50c><div class="indicator" data-v-d81de50c></div><h2 class="text" data-v-d81de50c>Development</h2><!----></div><div class="items" data-v-d81de50c><!--[--><div class="VPSidebarItem level-1 is-link" data-v-d81de50c data-v-d81de50c><div class="item" data-v-d81de50c><div class="indicator" data-v-d81de50c></div><a class="VPLink link link" href="/en/develop/" data-v-d81de50c><!--[--><p class="text" data-v-d81de50c>Get Started</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d81de50c data-v-d81de50c><div class="item" data-v-d81de50c><div class="indicator" data-v-d81de50c></div><a class="VPLink link link" href="/en/develop/structure.html" data-v-d81de50c><!--[--><p class="text" data-v-d81de50c>Project Structure</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d81de50c data-v-d81de50c><div class="item" data-v-d81de50c><div class="indicator" data-v-d81de50c></div><a class="VPLink link link" href="/en/develop/php-src-changes.html" data-v-d81de50c><!--[--><p class="text" data-v-d81de50c>PHP Source Modification</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-8d50c081><section class="VPSidebarItem level-0" data-v-8d50c081 data-v-d81de50c><div class="item" role="button" tabindex="0" data-v-d81de50c><div class="indicator" data-v-d81de50c></div><h2 class="text" data-v-d81de50c>Module</h2><!----></div><div class="items" data-v-d81de50c><!--[--><div class="VPSidebarItem level-1 is-link" data-v-d81de50c data-v-d81de50c><div class="item" data-v-d81de50c><div class="indicator" data-v-d81de50c></div><a class="VPLink link link" href="/en/develop/doctor-module.html" data-v-d81de50c><!--[--><p class="text" data-v-d81de50c>Doctor </p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d81de50c data-v-d81de50c><div class="item" data-v-d81de50c><div class="indicator" data-v-d81de50c></div><a class="VPLink link link" href="/en/develop/source-module.html" data-v-d81de50c><!--[--><p class="text" data-v-d81de50c>Source</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-8d50c081><section class="VPSidebarItem level-0" data-v-8d50c081 data-v-d81de50c><div class="item" role="button" tabindex="0" data-v-d81de50c><div class="indicator" data-v-d81de50c></div><h2 class="text" data-v-d81de50c>Extra</h2><!----></div><div class="items" data-v-d81de50c><!--[--><div class="VPSidebarItem level-1 is-link" data-v-d81de50c data-v-d81de50c><div class="item" data-v-d81de50c><div class="indicator" data-v-d81de50c></div><a class="VPLink link link" href="/en/develop/system-build-tools.html" data-v-d81de50c><!--[--><p class="text" data-v-d81de50c>Compilation Tools</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d81de50c data-v-d81de50c><div class="item" data-v-d81de50c><div class="indicator" data-v-d81de50c></div><a class="VPLink link link" href="/zh/develop/craft-yml.html" data-v-d81de50c><!--[--><p class="text" data-v-d81de50c>craft.yml Configuration</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-5e06b97a data-v-aff0b8d7><div class="VPDoc has-sidebar has-aside" data-v-aff0b8d7 data-v-7011f0d8><!--[--><!--]--><div class="container" data-v-7011f0d8><div class="aside" data-v-7011f0d8><div class="aside-curtain" data-v-7011f0d8></div><div class="aside-container" data-v-7011f0d8><div class="aside-content" data-v-7011f0d8><div class="VPDocAside" data-v-7011f0d8 data-v-3f215769><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-3f215769 data-v-60d5052e><div class="content" data-v-60d5052e><div class="outline-marker" data-v-60d5052e></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-60d5052e>On this page</div><ul class="VPDocOutlineItem root" data-v-60d5052e data-v-2d0bdf9b><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-3f215769></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-7011f0d8><div class="content-container" data-v-7011f0d8><!--[--><!--]--><main class="main" data-v-7011f0d8><div style="position:relative;" class="vp-doc _en_develop_structure" data-v-7011f0d8><div><h1 id="introduction-to-project-structure" tabindex="-1">Introduction to project structure <a class="header-anchor" href="#introduction-to-project-structure" aria-label="Permalink to “Introduction to project structure”"></a></h1><p>static-php-cli mainly contains three logical components: sources, dependent libraries, and extensions. These components contains 4 configuration files: <code>source.json</code>, <code>pkg.json</code>, <code>lib.json</code>, and <code>ext.json</code>.</p><p>A complete process for building standalone static PHP is:</p><ol><li>Use the source download module <code>Downloader</code> to download specified or all source codes. These sources include PHP source code, dependent library source code, and extension source code.</li><li>Use the source decompression module <code>SourceExtractor</code> to decompress the downloaded sources to the compilation directory.</li><li>Use the dependency tool to calculate the dependent extensions and dependent libraries of the currently added extension, and then compile each library that needs to be compiled in the order of dependencies.</li><li>After building each dependent library using <code>Builder</code> under the corresponding operating system, install it to the <code>buildroot</code> directory.</li><li>If external extensions are included (the source code does not contain extensions within PHP), copy the external extensions to the <code>source/php-src/ext/</code> directory.</li><li>Use <code>Builder</code> to build the PHP source code and build target to the <code>buildroot</code> directory.</li></ol><p>The project is mainly divided into several folders:</p><ul><li><code>bin/</code>: used to store program entry files, including <code>bin/spc</code>, <code>bin/spc-alpine-docker</code>, <code>bin/setup-runtime</code>.</li><li><code>config/</code>: Contains all the extensions and dependent libraries supported by the project, as well as the download link and download methods of these sources. It is divided into files: <code>lib.json</code>, <code>ext.json</code>, <code>source.json</code>, <code>pkg.json</code>, <code>pre-built.json</code> .</li><li><code>src/</code>: The core code of the project, including the entire framework and commands for compiling various extensions and libraries.</li><li><code>vendor/</code>: The directory that Composer depends on, you do not need to make any modifications to it.</li></ul><p>The operating principle is to start a <code>ConsoleApplication</code> of <code>symfony/console</code>, and then parse the commands entered by the user in the terminal.</p><h2 id="basic-command-line-structure" tabindex="-1">Basic command line structure <a class="header-anchor" href="#basic-command-line-structure" aria-label="Permalink to “Basic command line structure”"></a></h2><p><code>bin/spc</code> is an entry file, including the Unix common <code>#!/usr/bin/env php</code>, which is used to allow the system to automatically execute with the PHP interpreter installed on the system. After the project executes <code>new ConsoleApplication()</code>, the framework will automatically register them as commands.</p><p>The project does not directly use the Command registration method and command execution method recommended by Symfony. Here are small changes:</p><ol><li>Each command uses the <code>#[AsCommand()]</code> Attribute to register the name and description.</li><li>Abstract <code>execute()</code> so that all commands are based on <code>BaseCommand</code> (which is based on <code>Symfony\Component\Console\Command\Command</code>), and the execution code of each command itself is written in the <code>handle()</code> method .</li><li>Added variable <code>$no_motd</code> to <code>BaseCommand</code>, which is used to display the Figlet greeting when the command is executed.</li><li><code>BaseCommand</code> saves <code>InputInterface</code> and <code>OutputInterface</code> as member variables. You can use <code>$this-&gt;input</code> and <code>$this-&gt;output</code> within the command class.</li></ol><h2 id="basic-source-code-structure" tabindex="-1">Basic source code structure <a class="header-anchor" href="#basic-source-code-structure" aria-label="Permalink to “Basic source code structure”"></a></h2><p>The source code of the project is located in the <code>src/SPC</code> directory, supports automatic loading of the PSR-4 standard, and contains the following subdirectories and classes:</p><ul><li><code>src/SPC/builder/</code>: The core compilation command code used to build libraries, PHP and related extensions under different operating systems, and also includes some compilation system tool methods.</li><li><code>src/SPC/command/</code>: All commands of the project are here.</li><li><code>src/SPC/doctor/</code>: Doctor module, which is a relatively independent module used to check the system environment. It can be entered using the command <code>bin/spc doctor</code>.</li><li><code>src/SPC/exception/</code>: exception class.</li><li><code>src/SPC/store/</code>: Classes related to storage, files and sources are all here.</li><li><code>src/SPC/util/</code>: Some reusable tool methods are here.</li><li><code>src/SPC/ConsoleApplication.php</code>: command line program entry file.</li></ul><p>If you have read the source code, you may find that there is also a <code>src/globals/</code> directory, which is used to store some global variables, global methods, and non-PSR-4 standard PHP source code that is relied upon during the build process, such as extension sanity check code etc.</p><h2 id="phar-application-directory-issue" tabindex="-1">Phar application directory issue <a class="header-anchor" href="#phar-application-directory-issue" aria-label="Permalink to “Phar application directory issue”"></a></h2><p>Like other php-cli projects, spc itself has additional considerations for paths. Because spc can run in multiple modes such as <code>php-cli directly</code>, <code>micro SAPI</code>, <code>php-cli with Phar</code>, <code>vendor with Phar</code>, etc., there are ambiguities in various root directories. A complete explanation is given here. This problem is generally common in the base class path selection problem of accessing files in PHP projects, especially when used with <code>micro.sfx</code>.</p><p>Note that this may only be useful for you when developing Phar projects or PHP frameworks.</p><blockquote><p>Next, we will treat <code>static-php-cli</code> (that is, spc) as a normal <code>php</code> command line program. You can understand spc as any of your own php-cli applications for reference.</p></blockquote><p>There are three basic constant theoretical values below. We recommend that you introduce these three constants when writing PHP projects:</p><ul><li><p><code>WORKING_DIR</code>: the working directory when executing PHP scripts</p></li><li><p><code>SOURCE_ROOT_DIR</code> or <code>ROOT_DIR</code>: the root directory of the project folder, generally the directory where <code>composer.json</code> is located</p></li><li><p><code>FRAMEWORK_ROOT_DIR</code>: the root directory of the framework used, which may be used by self-developed frameworks. Generally, the framework directory is read-only</p></li></ul><p>You can define these constants in your framework entry or cli applications to facilitate the use of paths in your project.</p><p>The following are PHP built-in constant values, which have been defined inside the PHP interpreter:</p><ul><li><p><code>__DIR__</code>: the directory where the file of the currently executed script is located</p></li><li><p><code>__FILE__</code>: the file path of the currently executed script</p></li></ul><h3 id="git-project-mode-source" tabindex="-1">Git project mode (source) <a class="header-anchor" href="#git-project-mode-source" aria-label="Permalink to “Git project mode (source)”"></a></h3><p>Git project mode refers to a framework or program itself stored in plain text in the current folder, and running through <code>php path/to/entry.php</code>.</p><p>Assume that your project is stored in the <code>/home/example/static-php-cli/</code> directory, or your project is the framework itself, which contains project files such as <code>composer.json</code>:</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span>composer.json</span></span>
<span class="line"><span>src/App/MyCommand.app</span></span>
<span class="line"><span>vendor/*</span></span>
<span class="line"><span>bin/entry.php</span></span></code></pre></div><p>We assume that the above constants are obtained from <code>src/App/MyCommand.php</code>:</p><table tabindex="0"><thead><tr><th>Constant</th><th>Value</th></tr></thead><tbody><tr><td><code>WORKING_DIR</code></td><td><code>/home/example/static-php-cli</code></td></tr><tr><td><code>SOURCE_ROOT_DIR</code></td><td><code>/home/example/static-php-cli</code></td></tr><tr><td><code>FRAMEWORK_ROOT_DIR</code></td><td><code>/home/example/static-php-cli</code></td></tr><tr><td><code>__DIR__</code></td><td><code>/home/example/static-php-cli/src/App</code></td></tr><tr><td><code>__FILE__</code></td><td><code>/home/example/static-php-cli/src/App/MyCommand.php</code></td></tr></tbody></table><p>In this case, the values of <code>WORKING_DIR</code>, <code>SOURCE_ROOT_DIR</code>, and <code>FRAMEWORK_ROOT_DIR</code> are exactly the same: <code>/home/example/static-php-cli</code>.</p><p>The source code of the framework and the source code of the application are both in the current path.</p><h3 id="vendor-library-mode-vendor" tabindex="-1">Vendor library mode (vendor) <a class="header-anchor" href="#vendor-library-mode-vendor" aria-label="Permalink to “Vendor library mode (vendor)”"></a></h3><p>The vendor library mode generally means that your project is a framework or is installed into the project as a composer dependency by other applications, and the storage location is in the <code>vendor/author/XXX</code> directory.</p><p>Suppose your project is <code>crazywhalecc/static-php-cli</code>, and you or others install this project in another project using <code>composer require</code>.</p><p>We assume that static-php-cli contains all files except the <code>vendor</code> directory with the same <code>Git mode</code>, and get the constant value from <code>src/App/MyCommand</code>, Directory constant should be:</p><table tabindex="0"><thead><tr><th>Constant</th><th>Value</th></tr></thead><tbody><tr><td><code>WORKING_DIR</code></td><td><code>/home/example/another-app</code></td></tr><tr><td><code>SOURCE_ROOT_DIR</code></td><td><code>/home/example/another-app</code></td></tr><tr><td><code>FRAMEWORK_ROOT_DIR</code></td><td><code>/home/example/another-app/vendor/crazywhalecc/static-php-cli</code></td></tr><tr><td><code>__DIR__</code></td><td><code>/home/example/another-app/vendor/crazywhalecc/static-php-cli/src/App</code></td></tr><tr><td><code>__FILE__</code></td><td><code>/home/example/another-app/vendor/crazywhalecc/static-php-cli/src/App/MyCommand.php</code></td></tr></tbody></table><p>Here <code>SOURCE_ROOT_DIR</code> refers to the root directory of the project using <code>static-php-cli</code>.</p><h3 id="git-project-phar-mode-source-phar" tabindex="-1">Git project Phar mode (source-phar) <a class="header-anchor" href="#git-project-phar-mode-source-phar" aria-label="Permalink to “Git project Phar mode (source-phar)”"></a></h3><p>Git project Phar mode refers to the mode of packaging the project directory of the Git project mode into a <code>phar</code> file. We assume that <code>/home/example/static-php-cli</code> will be packaged into a Phar file, and the directory has the following files:</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span>composer.json</span></span>
<span class="line"><span>src/App/MyCommand.app</span></span>
<span class="line"><span>vendor/*</span></span>
<span class="line"><span>bin/entry.php</span></span></code></pre></div><p>When packaged into <code>app.phar</code> and stored in the <code>/home/example/static-php-cli</code> directory, <code>app.phar</code> is executed at this time. Assuming that the <code>src/App/MyCommand</code> code is executed, the constant is obtained in the file:</p><table tabindex="0"><thead><tr><th>Constant</th><th>Value</th></tr></thead><tbody><tr><td><code>WORKING_DIR</code></td><td><code>/home/example/static-php-cli</code></td></tr><tr><td><code>SOURCE_ROOT_DIR</code></td><td><code>phar:///home/example/static-php-cli/app.phar/</code></td></tr><tr><td><code>FRAMEWORK_ROOT_DIR</code></td><td><code>phar:///home/example/static-php-cli/app.phar/</code></td></tr><tr><td><code>__DIR__</code></td><td><code>phar:///home/example/static-php-cli/app.phar/src/App</code></td></tr><tr><td><code>__FILE__</code></td><td><code>phar:///home/example/static-php-cli/app.phar/src/App/MyCommand.php</code></td></tr></tbody></table><p>Because the <code>phar://</code> protocol is required to read files in the phar itself, the project root directory and the framework directory will be different from <code>WORKING_DIR</code>.</p><h3 id="vendor-library-phar-mode-vendor-phar" tabindex="-1">Vendor Library Phar Mode (vendor-phar) <a class="header-anchor" href="#vendor-library-phar-mode-vendor-phar" aria-label="Permalink to “Vendor Library Phar Mode (vendor-phar)”"></a></h3><p>Vendor Library Phar Mode means that your project is installed as a framework in other projects and stored in the <code>vendor</code> directory.</p><p>We assume that your project directory structure is as follows:</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span>composer.json # Composer configuration file of the current project</span></span>
<span class="line"><span>box.json # Configuration file for packaging Phar</span></span>
<span class="line"><span>another-app.php # Entry file of another project</span></span>
<span class="line"><span>vendor/crazywhalecc/static-php-cli/* # Your project is used as a dependent library</span></span></code></pre></div><p>When packaging these files under the directory <code>/home/example/another-app/</code> into <code>app.phar</code>, the value of the following constant for your project should be:</p><table tabindex="0"><thead><tr><th>Constant</th><th>Value</th></tr></thead><tbody><tr><td><code>WORKING_DIR</code></td><td><code>/home/example/another-app</code></td></tr><tr><td><code>SOURCE_ROOT_DIR</code></td><td><code>phar:///home/example/another-app/app.phar/</code></td></tr><tr><td><code>FRAMEWORK_ROOT_DIR</code></td><td><code>phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli</code></td></tr><tr><td><code>__DIR__</code></td><td><code>phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App</code></td></tr><tr><td><code>__FILE__</code></td><td><code>phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App/MyCommand.php</code></td></tr></tbody></table></div></div></main><footer class="VPDocFooter" data-v-7011f0d8 data-v-e257564d><!--[--><!--]--><!----><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-e257564d><span class="visually-hidden" id="doc-footer-aria-label" data-v-e257564d>Pager</span><div class="pager" data-v-e257564d><a class="VPLink link pager-link prev" href="/en/develop/" data-v-e257564d><!--[--><span class="desc" data-v-e257564d>Previous page</span><span class="title" data-v-e257564d>Get Started</span><!--]--></a></div><div class="pager" data-v-e257564d><a class="VPLink link pager-link next" href="/en/develop/php-src-changes.html" data-v-e257564d><!--[--><span class="desc" data-v-e257564d>Next page</span><span class="title" data-v-e257564d>PHP Source Modification</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-5e06b97a data-v-c3855bb3><div class="container" data-v-c3855bb3><p class="message" data-v-c3855bb3>Released under the MIT License.</p><p class="copyright" data-v-c3855bb3>Copyright © 2023-present crazywhalecc</p></div></footer><!--[--><!--]--></div></div>
<script>window.__VP_HASH_MAP__=JSON.parse("{\"deps-craft-yml.md\":\"DWPKeuXi\",\"deps-map-ext.md\":\"BxLeBUVK\",\"deps-map-lib.md\":\"DlxAq0L9\",\"en_contributing_index.md\":\"C8tXDL1f\",\"en_develop_craft-yml.md\":\"BDq8uWIr\",\"en_develop_doctor-module.md\":\"DYVfKght\",\"en_develop_index.md\":\"DSlquryN\",\"en_develop_php-src-changes.md\":\"DadHFaGC\",\"en_develop_source-module.md\":\"CeJEgS_j\",\"en_develop_structure.md\":\"D1kBTweh\",\"en_develop_system-build-tools.md\":\"DK4AaCy_\",\"en_faq_index.md\":\"3yHOajzp\",\"en_guide_action-build.md\":\"BCJvLz8l\",\"en_guide_build-on-windows.md\":\"CG23CkLK\",\"en_guide_build-with-glibc.md\":\"BDBCsGWa\",\"en_guide_cli-generator.md\":\"DwBYQMuK\",\"en_guide_deps-map.md\":\"DqPbUPJ0\",\"en_guide_env-vars.md\":\"DzVATbtO\",\"en_guide_extension-notes.md\":\"DadE5Bxb\",\"en_guide_extensions.md\":\"Bh08P1y7\",\"en_guide_index.md\":\"BE1G5v55\",\"en_guide_manual-build.md\":\"Bt-6mQR3\",\"en_guide_troubleshooting.md\":\"BvJgQKvb\",\"en_index.md\":\"kO-e39M0\",\"extension-notes.md\":\"DkpYDq7p\",\"extensions.md\":\"pYqpfHc4\",\"index.md\":\"Dnq-iVNo\",\"zh_contributing_index.md\":\"7JN5xgrv\",\"zh_develop_craft-yml.md\":\"Dfv1fXuq\",\"zh_develop_doctor-module.md\":\"B8r2lbU8\",\"zh_develop_index.md\":\"BFWliVJD\",\"zh_develop_php-src-changes.md\":\"CkjaMIky\",\"zh_develop_source-module.md\":\"DoBnezP5\",\"zh_develop_structure.md\":\"DStJTsYD\",\"zh_develop_system-build-tools.md\":\"CxPkPV_h\",\"zh_faq_index.md\":\"CZztxXAs\",\"zh_guide_action-build.md\":\"BWFrjWwZ\",\"zh_guide_build-on-windows.md\":\"6JBREABQ\",\"zh_guide_build-with-glibc.md\":\"CGbU937o\",\"zh_guide_cli-generator.md\":\"CTCl-bS5\",\"zh_guide_deps-map.md\":\"DQXDDLu_\",\"zh_guide_env-vars.md\":\"DqYHbUfS\",\"zh_guide_extension-notes.md\":\"DoauYqMF\",\"zh_guide_extensions.md\":\"CvO7qoz0\",\"zh_guide_index.md\":\"DIAjAKH4\",\"zh_guide_manual-build.md\":\"B-Ct9toa\",\"zh_guide_troubleshooting.md\":\"B9WGHMIU\",\"zh_index.md\":\"DcikGFee\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"static-php-cli\",\"description\":\"Build single static PHP binary, with PHP project together, with popular extensions included.\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"nav\":[],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/crazywhalecc/static-php-cli\"}]},\"locales\":{\"en\":{\"label\":\"English\",\"lang\":\"en\",\"themeConfig\":{\"nav\":[{\"text\":\"Guide\",\"link\":\"/en/guide/\"},{\"text\":\"Advanced\",\"link\":\"/en/develop/\"},{\"text\":\"Contributing\",\"link\":\"/en/contributing/\"},{\"text\":\"FAQ\",\"link\":\"/en/faq/\"}],\"sidebar\":{\"/en/guide/\":[{\"text\":\"Basic Build Guides\",\"items\":[{\"text\":\"Guide\",\"link\":\"/en/guide/\"},{\"text\":\"Build (Local)\",\"link\":\"/en/guide/manual-build\"},{\"text\":\"Build (CI)\",\"link\":\"/en/guide/action-build\"},{\"text\":\"Supported Extensions\",\"link\":\"/en/guide/extensions\"},{\"text\":\"Extension Notes\",\"link\":\"/en/guide/extension-notes\"},{\"text\":\"Build Command Generator\",\"link\":\"/en/guide/cli-generator\"},{\"text\":\"Environment Variables\",\"link\":\"/en/guide/env-vars\",\"collapsed\":true},{\"text\":\"Dependency Table\",\"link\":\"/en/guide/deps-map\"}]},{\"text\":\"Extended Build Guides\",\"items\":[{\"text\":\"Troubleshooting\",\"link\":\"/en/guide/troubleshooting\"},{\"text\":\"Build on Windows\",\"link\":\"/en/guide/build-on-windows\"},{\"text\":\"Build with GNU libc\",\"link\":\"/en/guide/build-with-glibc\"}]}],\"/en/develop/\":[{\"text\":\"Development\",\"items\":[{\"text\":\"Get Started\",\"link\":\"/en/develop/\"},{\"text\":\"Project Structure\",\"link\":\"/en/develop/structure\"},{\"text\":\"PHP Source Modification\",\"link\":\"/en/develop/php-src-changes\"}]},{\"text\":\"Module\",\"items\":[{\"text\":\"Doctor \",\"link\":\"/en/develop/doctor-module\"},{\"text\":\"Source\",\"link\":\"/en/develop/source-module\"}]},{\"text\":\"Extra\",\"items\":[{\"text\":\"Compilation Tools\",\"link\":\"/en/develop/system-build-tools\"},{\"text\":\"craft.yml Configuration\",\"link\":\"/zh/develop/craft-yml\"}]}],\"/en/contributing/\":[{\"text\":\"Contributing\",\"items\":[{\"text\":\"Contributing\",\"link\":\"/en/contributing/\"}]}]},\"footer\":{\"message\":\"Released under the MIT License.\",\"copyright\":\"Copyright © 2023-present crazywhalecc\"}}},\"zh\":{\"label\":\"简体中文\",\"lang\":\"zh\",\"themeConfig\":{\"nav\":[{\"text\":\"构建指南\",\"link\":\"/zh/guide/\"},{\"text\":\"进阶\",\"link\":\"/zh/develop/\"},{\"text\":\"贡献\",\"link\":\"/zh/contributing/\"},{\"text\":\"FAQ\",\"link\":\"/zh/faq/\"}],\"sidebar\":{\"/zh/guide/\":[{\"text\":\"构建指南\",\"items\":[{\"text\":\"指南\",\"link\":\"/zh/guide/\"},{\"text\":\"本地构建\",\"link\":\"/zh/guide/manual-build\"},{\"text\":\"Actions 构建\",\"link\":\"/zh/guide/action-build\"},{\"text\":\"扩展列表\",\"link\":\"/zh/guide/extensions\"},{\"text\":\"扩展注意事项\",\"link\":\"/zh/guide/extension-notes\"},{\"text\":\"编译命令生成器\",\"link\":\"/zh/guide/cli-generator\"},{\"text\":\"环境变量列表\",\"link\":\"/zh/guide/env-vars\"},{\"text\":\"依赖关系图表\",\"link\":\"/zh/guide/deps-map\"}]},{\"text\":\"扩展构建指南\",\"items\":[{\"text\":\"故障排除\",\"link\":\"/zh/guide/troubleshooting\"},{\"text\":\"在 Windows 上构建\",\"link\":\"/zh/guide/build-on-windows\"},{\"text\":\"构建 GNU libc 兼容的二进制\",\"link\":\"/zh/guide/build-with-glibc\"}]}],\"/zh/develop/\":[{\"text\":\"开发指南\",\"items\":[{\"text\":\"开发简介\",\"link\":\"/zh/develop/\"},{\"text\":\"项目结构简介\",\"link\":\"/zh/develop/structure\"},{\"text\":\"对 PHP 源码的修改\",\"link\":\"/zh/develop/php-src-changes\"}]},{\"text\":\"模块\",\"items\":[{\"text\":\"Doctor 环境检查工具\",\"link\":\"/zh/develop/doctor-module\"},{\"text\":\"资源模块\",\"link\":\"/zh/develop/source-module\"}]},{\"text\":\"其他\",\"items\":[{\"text\":\"系统编译工具\",\"link\":\"/zh/develop/system-build-tools\"},{\"text\":\"craft.yml 配置详解\",\"link\":\"/zh/develop/craft-yml\"}]}],\"/zh/contributing/\":[{\"text\":\"贡献指南\",\"items\":[{\"text\":\"贡献指南\",\"link\":\"/zh/contributing/\"}]}]},\"footer\":{\"message\":\"Released under the MIT License.\",\"copyright\":\"Copyright © 2023-present crazywhalecc\"}}}},\"scrollOffset\":134,\"cleanUrls\":false,\"additionalConfig\":{}}");</script>
</body>
</html>