Cake PHP4의 Constore/Command를 사용한 배치
10145 단어 CakePHP4
인도하다
랜서스는 현재 CakePHP2→CakePHP4로 버전 업그레이드를 진행 중이다.
CakePHP1.3→2 버전 업그레이드와 비교하여 간단한 절차에 따라 변환할 수 없습니다.
CakePHP→3or 4 버전으로 업그레이드하면 변경이 많아 재제작 작업시간과 거의 같다.
다시 만들려면 이 타이밍에 지금까지의 부채를 해결하고 대량과 관리 화면을 다른 창고로 분리해 재건 중이다.
https://speakerdeck.com/ykanazawa/ransazufalse-cakephp4yi-xing-nituite?slide=9
또 이 과정에서 CakePHP4 이후의 기술 노하우를 저장해 이후 랜서스 호스트의 CakePHP4 이전에도 적용한다.
셸에서 Comnsole/Command로 이동
CakePHP2가 현재 운용 중인 셸 레벨은 CakePHP5에서 폐지됩니다.
따라서 CakePHP4가 일괄 처리를 다시 하는 과정에서 Constore/Command로 옮겨졌다.
CakePHP4.x: 콘솔 명령
https://book.cakephp.org/4/ja/console-and-shells/commands.html
다중 부팅 방지 방법
CakePHP2에서 운용 중인 로트는 대부분 크론에서 정기적으로 수행되기 때문에 다중가동 방지 처리를 독자적으로 시행했다.
다중 가동 방지 처리에는 주로 다음과 같은 방법이 있다.
그러나 일괄 처리 이상이 끝난 후 떨어지면 잠금 파일이 남아서 수동으로 삭제하지 않으면 시작할 수 없습니다.
2가지 방법으로 시행되는 부분도 있지만, 비슷한 이름의 과정이 있으면 잘못된 판정이 많아 좋은 방법은 아닌 것 같다.
3은 많은 서버 중간부품이 사용하는 방법이다.
에 작성된 프로세스 번호가 일치하면 시작하지 않습니다.
일치하지 않으면 프로세스 번호를 덮어쓰고 시작합니다.
새로운 차례는 세 가지 방법을 채택하기로 결정했다.
공공 클래스에서 다중 시작 처리를 실현하다
다음은 다중 방지 처리의 설치입니다.
BaseCommand 클래스가 생성되어 모든 로트 클래스를 상속할 수 있습니다.
<?php
declare(strict_types=1);
namespace App\Command;
use Cake\Console\Command;
use ReflectionClass;
class BaseCommand extends Command
{
protected $className;
protected $lockFileName;
protected $isLockfileExit = false;
public function __construct()
{
parent::__construct();
$this->className = (new ReflectionClass($this))->getShortName();
$this->lockFileName = TMP . $this->className . '.lock';
// ロックファイルのプロセスIDをチェック
if ($this->checkLockFile()) {
$this->isLockfileExit = true;
exit;
}
// ロックファイルの作成
file_put_contents($this->lockFileName, getmypid());
}
public function __destruct()
{
// プロセスがすでに存在して強制終了でなければ
if (!$this->isLockfileExit) {
// ロックファイルの削除
unlink($this->lockFileName);
}
}
/*
* ロックファイルのプロセスIDをチェック
*/
protected function checkLockFile(): bool
{
// ロックファイルの存在確認
if (!file_exists($this->lockFileName)) {
return false;
}
// ファイル内に記載されているプロセスIDを取得
$pid = file_get_contents($this->lockFileName);
$pid = str_replace(PHP_EOL, '', $pid);
if (!is_numeric($pid)) {
return false;
}
//取得したプロセスIDが動いていないかチェック
$output = [];
$cmd = "ps h " . $pid;
exec($cmd, $output);
if (isset($output[0])) {
echo "Process already exists.\n";
echo $output[0] . "\n";
return true;
}
return false;
}
}
일괄 처리 실행 시 메모리 소모 정보
이전 전 Cake PHP 2차례, 원래는 Cake PHP 1이었다.많은 것이 3시대에 이루어졌다.
CakePHP1.3의 경우 많은 시간이 걸리면 메모리 유출성 사용량이 지속적으로 증가하여 결국 대량은 감소한다.
이른바 모델 캐시로 PHP-FPM 등 애플리케이션 서버(정기 교체 프로그램)는 대부분 큰 문제가 생기지 않지만, 많은 시간이 걸리는 양산으로 이를 표면화할 수 있기 때문이다.
※ 2010년께까지도 같은 사건에 대해 레일즈와 젠드프레임워크가 고민을 한 적이 있어 당시 프레임이 공통된 문제일 수 있습니다.
따라서 오랜 시간이 소요되는 일괄 처리 중, 예를 들어 모든 사용자 ID에 따라 처리를 나누고, 여러 번 시작해서 대응한다.
※ 모델에서find 함수를 호출할 때 발생하기 때문에 일반 PHP를 사용하여 PDO에서 SQL을 직접 실행하는 것도 피할 수 있습니다.
CakePHP4가 재제작된 로트에서 부팅이 확인되면 메모리 소비는 어느 정도 증가하지만 어느 정도 이상 증가하지는 않는다.
다음은 새로 도착한 작업 메일의 대량 메모리 사용량의 변화입니다.
양산을 시작할 때는 약 18MB를 소비했다가 이후 꾸준히 증가했으나 26MB 정도에서 안정됐다.
$ bin/cake NewWorkEmail
送信数:22 メモリ使用量:18874368 user_id:380
送信数:39 メモリ使用量:18874368 user_id:666
送信数:59 メモリ使用量:18874368 user_id:2982
送信数:78 メモリ使用量:18874368 user_id:3695
送信数:99 メモリ使用量:20971520 user_id:2367310
送信数:112 メモリ使用量:20971520 user_id:2367353
送信数:126 メモリ使用量:20971520 user_id:2367380
...
送信数:6685 メモリ使用量:27262976 user_id:2377277
送信数:6702 メモリ使用量:27262976 user_id:2377294
送信数:6715 メモリ使用量:27262976 user_id:2377313
$
※ 2021/04/15 보충:12시간의 대량 검증
14MB→16MB→18MB→...→52MB
(연)까지 계속 늘어나는 것을 확인했다.
그러나 걸음걸이가 상당히 느려 장편이라도 어느 정도 참을 수 있었다.
CakePHP1.3, CakePHP2 시대에 메모리가 계속 증가했기 때문에 몇 번의 실행으로 나누어 회피했지만 CakePHP4로 다시 만든 횟수는 한 번에 실행할 수 있어 처리 시간을 단축했다.
※ Cake PHP2에서는 모델 캐시를 끄고 Cake PHP2로 옮길 수 있을 경우 문제가 해결될 수 있지만, 적어도 Cake PHP4가 설치된 횟수에 대해서는 메모리 유출성 증가를 걱정할 필요가 없습니다.
참고 자료: https://qiita.com/zaru/items/b3cf10c043d0304cdc34
Reference
이 문제에 관하여(Cake PHP4의 Constore/Command를 사용한 배치), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yKanazawa/items/e02d6adffb20da00c81c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)