백엔드 개발 PHP 튜토리얼 PHP 코드를 올바르게 게시하는 예 공유

PHP 코드를 올바르게 게시하는 예 공유

Mar 12, 2018 pm 02:44 PM
php 공유하다


거의 모든 PHP 프로그래머가 코드를 출시했습니다. 이 코드는 FTP 또는 rsync 를 통해 동기화되거나 svn 또는 git을 통해 업데이트될 수 있습니다. 활발한 프로젝트는 하루에 여러 번 코드를 공개할 수도 있지만, 세부 사항에 주의를 기울이는 사람은 거의 없으며, 실제로는 함정이 많고, 자신도 모르게 수렁에 빠져 있을 가능성이 있습니다.

제대로 구현된 게시 시스템은 최소한 원자 게시를 지원해야 합니다. 각 버전이 독립적인 상태를 나타내는 경우 릴리스 기간 동안 모든 요청은 단일 상태에서만 실행될 수 있습니다. 이를 원자 릴리스 지원이라고 합니다. 반대로, 요청이 릴리스 중에 여러 상태에 걸쳐 있으면 원자 릴리스라고 할 수 없습니다. 설명을 위해 예를 들어 보겠습니다. include a.php일 때 요청에 두 개의 <code>include 两个 PHP 文件,分别是 a.phpb.php,当 include a.php 完成后,发布代码,接着 include b.php,如果处理不当的话,那么就可能会导致旧版本的 a.php 和新版本的 b.php 同时存在于同一个请求之中,换句话说就是没有实现原子发布。

开源世界里有很多不错的发布代码工具,比如  ruby 社区的 capistrano,其流程大致就是发布代码到一个全新的目录,然后再软链接到真正的发布目录。

├── current -> releases/v1
└── releases
    ├── v1
    │   ├── foo.php
    │   └── bar.php
    └── v2
        ├── foo.php
        └── bar.php
로그인 후 복사

不过鉴于 PHP 本身的特殊性,如果只是简单套用上面的流程,那么将很难实现真正的原子发布。要理清个中缘由,还需要了解一下 PHP 中的两个 Cache 的概念:

  • opcode cache

  • PHP 코드를 올바르게 게시하는 예 공유 cache

先聊聊 opcode cache,基本就是 apc 或者 zend opcode,关于它的作用,大家都已经很熟悉,不必多言,需要注意的是 apc 的 bug 很多,比如开启了 apc.enable_cli 配置后就会有很多灵异问题,所以说 opcode cache 还是尽可能使用 zend opcache 吧,如果需要缓存数据,可以用 apcu。此外 apczend opcode 对缓存键的选择有所差异:apc 选择的是文件的 inodezend opcode 选择的是文件的 path

再聊聊 PHP 코드를 올바르게 게시하는 예 공유 cache,它的作用是缓冲获取文件信息的 IO 操作,大多数时候它对我们而言是透明的,以至于很多人都不知道它的存在,需要注意的是 PHP 코드를 올바르게 게시하는 예 공유 cache 是进程级别的,也就是说,每一个 php-fpm 进程都有自己独立的 PHP 코드를 올바르게 게시하는 예 공유 cache

假设在发布代码期间,opcode cache 或者 PHP 코드를 올바르게 게시하는 예 공유 cache 里的数据出现过期,那么就会出现一部分缓存是旧文件,一部分缓存是新文件的非原子发布的情况,为了避免出现这种情况,我们应该保证缓存过期时间足够长,最好是除非我们手动刷新,否则永远不过期,对应到配置上就是:关闭 apc.stat、opcache.validate_timestamps 配置,设置足够大的 PHP 코드를 올바르게 게시하는 예 공유_cache_size、PHP 코드를 올바르게 게시하는 예 공유_cache_ttl 配置,必要的监控总是有好处的。

相关的技术细节特别琐碎,建议大家仔细阅读如下资料:

  • PHP 코드를 올바르게 게시하는 예 공유_cache
    PHP’s OPCache extension review
    Atomic PHP 코드를 올바르게 게시하는 예 공유s at Etsy
    Cache invalidation for scripts in symlinked folders
    로그인 후 복사

在采用软链接发布代码的时候,通常遇到的第一个问题多半是新代码不生效!即便调用了 apc_clear_cache 或者 opcache_reset 方法也无效,重启 php-fpm 自然是能够解决问题,不过对脚本语言来说重启太重了!难道除了重启就没有别的办法了么?

事实上之所以会出现这样的问题,主要是因为 opcode cache 是通过 PHP 코드를 올바르게 게시하는 예 공유 cache 获取文件信息,即便软链接已经指向了新位置,但是如果 PHP 코드를 올바르게 게시하는 예 공유 cache 里还保存着旧数据的话,opcode cache 依然无法知道新代码的存在,缺省情况下,PHP 코드를 올바르게 게시하는 예 공유_cache_ttl 缓存有效期是两分钟,这意味着发布代码后,可能要两分钟才能生效。为了让发布尽快生效,需要以进程为单位清除 PHP 코드를 올바르게 게시하는 예 공유 cache

<?php

    $key = &#39;php.pid_&#39; . getmypid();    if (($rev = apc_fetch($key)) != DEPLOY_VERSION) {        if($rev < DEPLOY_VERSION) {
            apc_store($key, DEPLOY_VERSION);
        }

        clearstatcache(true);
    }
로그인 후 복사

如此在 apc 环境下基本就能工作了,但是在 zend opcode 环境下还可能有问题。因为在缺省情况下 opcache.revalidate_path 是关闭的,此时会缓存未解析的符号链接的值,这会导致即便软链接指向修改了,也无法生效,所以在使用 zend opcode 的时候,如果使用了软链接,视情况可能需要把 opcache.revalidate_pathPHP

파일, 즉 a.phpb.php >가 필요하다고 가정해 보겠습니다. 가 완료되면 코드를 게시한 다음 b.php를 포함하세요. 제대로 처리되지 않으면 a.php의 이전 버전이 생성될 수 있습니다. b.php의 새 버전이 동일한 요청에 동시에 존재합니다. 즉, 원자 게시가 구현되지 않습니다. 🎜🎜오픈 소스 세계에는 🎜ruby🎜 커뮤니티의 capistrano와 같은 좋은 코드 게시 도구가 많이 있습니다. 프로세스는 대략적으로 코드를 새로운 디렉터리에 게시한 다음 실제 릴리스 디렉터리에 대한 소프트 링크입니다. 🎜
    fastcgi_param SCRIPT_FILENAME $PHP 코드를 올바르게 게시하는 예 공유_root$fastcgi_script_name;    fastcgi_param DOCUMENT_ROOT $PHP 코드를 올바르게 게시하는 예 공유_root;
로그인 후 복사
로그인 후 복사
🎜그러나 🎜PHP🎜 자체의 특수성으로 인해 단순히 위의 프로세스를 적용한다면 진정한 원자 방출을 달성하기 어려울 것입니다. 이유를 명확히 하려면 🎜PHP🎜에 있는 두 캐시의 개념도 이해해야 합니다. 🎜
  • 🎜🎜opcode 캐시🎜 🎜
  • 🎜🎜PHP 코드를 올바르게 게시하는 예 공유 캐시🎜🎜
🎜 먼저 기본적으로 apc 또는 인 <code>opcode 캐시에 대해 이야기해 보겠습니다. > zend opcode, 모두가 이미 그 기능에 익숙합니다. 말할 필요도 없이 apc에는 많은 버그가 있습니다. 예를 들어, apc.enable_cli 구성을 켠 후에는 많을 겁니다. 이상한 문제이므로 opcode 캐시는 최대한 zend opcache를 사용해야 합니다. 데이터를 캐시해야 하는 경우 apcu를 사용하면 됩니다. 또한 apczend opcode에는 서로 다른 캐시 키 선택이 있습니다. apc는 파일의 inode를 선택합니다. zend opcode는 파일의 경로를 선택합니다. 🎜🎜 PHP 코드를 올바르게 게시하는 예 공유 캐시에 대해 다시 이야기해 보겠습니다. 그 기능은 🎜IO🎜 작업을 버퍼링하여 파일 정보를 얻는 것입니다. 대부분의 경우 이는 우리에게 투명하므로 많은 사람들이 이를 모릅니다. 존재하지만 PHP 코드를 올바르게 게시하는 예 공유 캐시는 프로세스 수준에 있다는 점에 유의해야 합니다. 즉, 각 php-fpm 프로세스에는 자체적인 독립적인 PHP 코드를 올바르게 게시하는 예 공유 캐시가 있습니다. 코드> >. 🎜🎜코드를 릴리스하는 동안 opcode 캐시 또는 PHP 코드를 올바르게 게시하는 예 공유 캐시의 데이터가 만료되고 캐시의 일부가 오래된 파일과 캐시의 일부는 새 파일입니다. 원자 게시의 경우 이러한 상황을 방지하려면 캐시 만료 시간을 수동으로 새로 고치지 않는 한 만료되지 않는 것이 가장 좋습니다. 구성은 다음과 같습니다. apc.stat, opcache.validate_timestamps 구성을 닫습니다. PHP 코드를 올바르게 게시하는 예 공유_cache_size 및 PHP 코드를 올바르게 게시하는 예 공유_cache_ttl 구성을 충분히 크게 설정하고 필요한 모니터링을 수행하는 것이 항상 유익합니다. 🎜🎜관련 기술 세부 사항은 매우 사소한 것이므로 다음 정보를 주의 깊게 읽어 보시기 바랍니다. 🎜
  • <?php// PHP 코드를 올바르게 게시하는 예 공유:releaserun("cd {{PHP 코드를 올바르게 게시하는 예 공유_path}} && if [ -h release ]; then rm release; fi");
    run("ln -s $releasePath {{PHP 코드를 올바르게 게시하는 예 공유_path}}/release");// PHP 코드를 올바르게 게시하는 예 공유:symlinkrun("cd {{PHP 코드를 올바르게 게시하는 예 공유_path}} && ln -sfn {{release_path}} current");
    run("cd {{PHP 코드를 올바르게 게시하는 예 공유_path}} && rm release");?>
    로그인 후 복사
    로그인 후 복사
🎜코드를 게시할 때. 소프트 링크를 사용할 때 일반적으로 발생하는 첫 번째 문제는 새 코드가 적용되지 않는다는 것입니다! apc_clear_cache 또는 opcache_reset 메소드를 호출해도 작동하지 않습니다. php-fpm을 다시 시작하면 문제가 자연스럽게 해결되지만 스크립트 언어에서는 다시 시작하는 것이 너무 무겁습니다! 다시 시작하는 것 외에 다른 방법은 없나요? 🎜🎜사실 이런 문제가 발생하는 이유는 주로 opcode 캐시PHP 코드를 올바르게 게시하는 예 공유 캐시를 통해 파일 정보를 얻기 때문입니다. 소프트 링크가 새로운 위치를 가리켰음에도 불구하고, 그러나 이전 데이터가 여전히 PHP 코드를 올바르게 게시하는 예 공유 캐시에 저장되어 있는 경우 opcode 캐시는 여전히 새 코드의 존재를 알 수 없습니다. 기본적으로 PHP 코드를 올바르게 게시하는 예 공유_cache_ttl 캐시 유효 기간은 2분입니다. 코드가 발급된 후 적용되기까지 최대 2분이 걸릴 수 있다는 의미입니다. 릴리스가 최대한 빨리 적용되려면 프로세스 단위에서 PHP 코드를 올바르게 게시하는 예 공유 캐시를 지워야 합니다. 🎜
shell> strace ln -sfn releases/foo currentsymlink("releases/foo", "current")      = -1 EEXIST (File exists)unlink("current")                       = 0symlink("releases/foo", "current")      = 0
로그인 후 복사
로그인 후 복사
🎜 이는 기본적으로 apc 환경에서 작동합니다. , 그러나 zend opcode 에서 환경에 문제가 있을 수도 있습니다. opcache.revalidate_path는 기본적으로 해제되어 있으므로 해결되지 않은 심볼릭 링크의 값이 캐시됩니다. 따라서 zend opcode를 사용하면 소프트 링크가 적용되지 않습니다. , 소프트 링크를 사용하는 경우 상황에 따라 opcache.revalidate_path를 활성화해야 할 수도 있습니다. 🎜

详细介绍参考:PHP’s OPCache extension review。

BTW:如果需要手动重置 opcode cache,需要注意的是因为它是基于 SAPI 的概念,所以不能直接在命令行下调用 apc_clear_cache 或者 opcache_reset 方法来重置缓存,当然办法总是有的,那就是使用 CacheTool 在命令行下模拟 fastcgi 请求。

分析到这里,我们不妨反思一下:在 PHP 中原子发布之所以是一个棘手的问题,归根结底是因为软链接和缓存之间的的矛盾。不管是 opcode cache 还是 PHP 코드를 올바르게 게시하는 예 공유 cache,都是 PHP 固有的缓存特性,基于客观需要无法绕开,如此说来是否有办法绕开软链接,使其成为马奇诺防线呢?答案是 NGINX 的 $PHP 코드를 올바르게 게시하는 예 공유_root:

    fastcgi_param SCRIPT_FILENAME $PHP 코드를 올바르게 게시하는 예 공유_root$fastcgi_script_name;    fastcgi_param DOCUMENT_ROOT $PHP 코드를 올바르게 게시하는 예 공유_root;
로그인 후 복사
로그인 후 복사

有了 $PHP 코드를 올바르게 게시하는 예 공유_root,即便 DOCUMENT_ROOT 目录中含有软链接,NGINX 也会把软链接指向的真正的路径发给 PHP,也就是说,对 PHP 而言,软链接已经不存在了!不过作为代价,每一次请求,NGINX 都要通过相对昂贵的 IO 操作获取 $PHP 코드를 올바르게 게시하는 예 공유_root 的值,通过 strace 命令我们能监控这一过程,下图从 currentfoo 的过程:

PHP 코드를 올바르게 게시하는 예 공유

在本例中,压测发现使用 $PHP 코드를 올바르게 게시하는 예 공유_root 后,性能下降了大约 5% 左右,不过明眼人一下就能发现,虽然 $PHP 코드를 올바르게 게시하는 예 공유_root 导致了 lstatreadlink 操作,但是 lstat 操作的次数是和目录深度成正比的,也就是说目录越深,执行的 lstat 次数越多,性能下降也就越大。如果能够降低发布目录的深度,那么可以预计还能降低一些性能损耗。

结尾介绍一下 Deployer,它是 PHP 中做得比较好的工具,有很多特色,比如支持并行发布,具体演示如下图,左边是串行,右边是并行,使用「vvv」能得到更详细信息:

PHP 코드를 올바르게 게시하는 예 공유

不过 Deployer 在原子发布上有一点瑕疵,具体见 release/symlink 代码:

<?php// PHP 코드를 올바르게 게시하는 예 공유:releaserun("cd {{PHP 코드를 올바르게 게시하는 예 공유_path}} && if [ -h release ]; then rm release; fi");
run("ln -s $releasePath {{PHP 코드를 올바르게 게시하는 예 공유_path}}/release");// PHP 코드를 올바르게 게시하는 예 공유:symlinkrun("cd {{PHP 코드를 올바르게 게시하는 예 공유_path}} && ln -sfn {{release_path}} current");
run("cd {{PHP 코드를 올바르게 게시하는 예 공유_path}} && rm release");?>
로그인 후 복사
로그인 후 복사

release 的时候,它是先删除再创建,是一个两步的非原子操作,在 symlink 的时候,看上去「ln -sfn」是单步原子操作,实际上也是错误的:

shell> strace ln -sfn releases/foo currentsymlink("releases/foo", "current")      = -1 EEXIST (File exists)unlink("current")                       = 0symlink("releases/foo", "current")      = 0
로그인 후 복사
로그인 후 복사

通过 strace 我们能清晰的看到,虽然表面上使用「ln -sfn」是一步操作,但是内部依然是按照先删除再创建的逻辑执行的,实际上这里应该搭配使用「ln & mv」

shell> ln -sfn releases/foo current.tmpshell> mv -fT current.tmp current
로그인 후 복사

先通过 ln 创建一个临时的软链接,再通过 mv 实现原子操作,此时如果使用 strace 监控,会发现 mv「T」 选项实际上仅仅执行了一个 rename 操作,所以是原子的。

BTW:在使用「ln -sfn」前后,如果使用 stat 查看新旧文件的 inode 的话,可能会发现它们拥有一样的 inode 值,看上去和我们的结论相悖,其实不然,实际上只是复用删除值而已(如果想验证,注意 Linux 会复用,Mac 不会复用)。

据说一千个人的心中就有一千个哈姆雷特,不过我希望所有的 PHP 程序员在发布 PHP 代码的时候都能采用一种方法,那就是本文介绍的方法,正确的方法。

相关推荐:

php代码标志基础讲解

提高PHP代码质量的方法

JS和PHP代码实现用户输入数字后显示最大的值

위 내용은 PHP 코드를 올바르게 게시하는 예 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

<gum> : Bubble Gum Simulator Infinity- 로얄 키를 얻고 사용하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
Nordhold : Fusion System, 설명
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora : 마녀 트리의 속삭임 - Grappling Hook 잠금 해제 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP 및 Python : 두 가지 인기있는 프로그래밍 언어를 비교합니다 PHP 및 Python : 두 가지 인기있는 프로그래밍 언어를 비교합니다 Apr 14, 2025 am 12:13 AM

PHP와 Python은 각각 고유 한 장점이 있으며 프로젝트 요구 사항에 따라 선택합니다. 1.PHP는 웹 개발, 특히 웹 사이트의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 간결한 구문을 가진 데이터 과학, 기계 학습 및 인공 지능에 적합하며 초보자에게 적합합니다.

PHP 실행 : 실제 예제 및 응용 프로그램 PHP 실행 : 실제 예제 및 응용 프로그램 Apr 14, 2025 am 12:19 AM

PHP는 전자 상거래, 컨텐츠 관리 시스템 및 API 개발에 널리 사용됩니다. 1) 전자 상거래 : 쇼핑 카트 기능 및 지불 처리에 사용됩니다. 2) 컨텐츠 관리 시스템 : 동적 컨텐츠 생성 및 사용자 관리에 사용됩니다. 3) API 개발 : 편안한 API 개발 및 API 보안에 사용됩니다. 성능 최적화 및 모범 사례를 통해 PHP 애플리케이션의 효율성과 유지 보수 성이 향상됩니다.

PHP : 웹 개발의 핵심 언어 PHP : 웹 개발의 핵심 언어 Apr 13, 2025 am 12:08 AM

PHP는 서버 측에서 널리 사용되는 스크립팅 언어이며 특히 웹 개발에 적합합니다. 1.PHP는 HTML을 포함하고 HTTP 요청 및 응답을 처리 할 수 ​​있으며 다양한 데이터베이스를 지원할 수 있습니다. 2.PHP는 강력한 커뮤니티 지원 및 오픈 소스 리소스를 통해 동적 웹 컨텐츠, 프로세스 양식 데이터, 액세스 데이터베이스 등을 생성하는 데 사용됩니다. 3. PHP는 해석 된 언어이며, 실행 프로세스에는 어휘 분석, 문법 분석, 편집 및 실행이 포함됩니다. 4. PHP는 사용자 등록 시스템과 같은 고급 응용 프로그램을 위해 MySQL과 결합 할 수 있습니다. 5. PHP를 디버깅 할 때 error_reporting () 및 var_dump ()와 같은 함수를 사용할 수 있습니다. 6. 캐싱 메커니즘을 사용하여 PHP 코드를 최적화하고 데이터베이스 쿼리를 최적화하며 내장 기능을 사용하십시오. 7

PHP의 지속적인 관련성 : 여전히 살아 있습니까? PHP의 지속적인 관련성 : 여전히 살아 있습니까? Apr 14, 2025 am 12:12 AM

PHP는 여전히 역동적이며 현대 프로그래밍 분야에서 여전히 중요한 위치를 차지하고 있습니다. 1) PHP의 단순성과 강력한 커뮤니티 지원으로 인해 웹 개발에 널리 사용됩니다. 2) 유연성과 안정성은 웹 양식, 데이터베이스 작업 및 파일 처리를 처리하는 데 탁월합니다. 3) PHP는 지속적으로 발전하고 최적화하며 초보자 및 숙련 된 개발자에게 적합합니다.

PHP vs. Python : 차이점 이해 PHP vs. Python : 차이점 이해 Apr 11, 2025 am 12:15 AM

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.

PHP 및 Python : 코드 예제 및 비교 PHP 및 Python : 코드 예제 및 비교 Apr 15, 2025 am 12:07 AM

PHP와 Python은 고유 한 장점과 단점이 있으며 선택은 프로젝트 요구와 개인 선호도에 달려 있습니다. 1.PHP는 대규모 웹 애플리케이션의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 데이터 과학 및 기계 학습 분야를 지배합니다.

PHP 대 기타 언어 : 비교 PHP 대 기타 언어 : 비교 Apr 13, 2025 am 12:19 AM

PHP는 특히 빠른 개발 및 동적 컨텐츠를 처리하는 데 웹 개발에 적합하지만 데이터 과학 및 엔터프라이즈 수준의 애플리케이션에는 적합하지 않습니다. Python과 비교할 때 PHP는 웹 개발에 더 많은 장점이 있지만 데이터 과학 분야에서는 Python만큼 좋지 않습니다. Java와 비교할 때 PHP는 엔터프라이즈 레벨 애플리케이션에서 더 나빠지지만 웹 개발에서는 더 유연합니다. JavaScript와 비교할 때 PHP는 백엔드 개발에서 더 간결하지만 프론트 엔드 개발에서는 JavaScript만큼 좋지 않습니다.

PHP와 Python : 다른 패러다임이 설명되었습니다 PHP와 Python : 다른 패러다임이 설명되었습니다 Apr 18, 2025 am 12:26 AM

PHP는 주로 절차 적 프로그래밍이지만 객체 지향 프로그래밍 (OOP)도 지원합니다. Python은 OOP, 기능 및 절차 프로그래밍을 포함한 다양한 패러다임을 지원합니다. PHP는 웹 개발에 적합하며 Python은 데이터 분석 및 기계 학습과 같은 다양한 응용 프로그램에 적합합니다.

See all articles