아이스콘 8 예선에서 탈락했기 때문에 스와일(easywoole)로 다시 쓰고, 소감전에서 벤치로 뛰면

CyberAgent Developers #2 Advent Calendar 2018
의 21일 담당@goodoo

PHP Conference 2018 LT에서 한 단락의 해설입니다.


2018/12/15에 PHP Conference 2018 LT에 발표되었는데 시간이 다 될 줄은 몰랐고 마지막에 충분히 말하지 못했다.
LT 5분 내에도 제대로 전달되지 않는 부분이 있기 때문에 제가 설명해 드리겠습니다

발표 자료


아이스콘 8 예선에서 탈락했기 때문에 스와일(easywoole)로 다시 쓰고, 소감전에서 벤치로 뛰면

스와우란?


한마디로
"PHP 이벤트 구동 비동기 & 코르크 기반 병렬 처리 프로그램 라이브러리"
예, 그렇습니다.
pecl로 설치 가능pecl install swoole가입하다

이른바 easywoole


한마디로
"easywoole은 Swoole Server를 기반으로 하는 상주 메모리 기반의 분산 PHP 프레임워크입니다."
예, 그렇습니다.
잘 모르겠지만, 자신의 첫 인상은:
Node.이것은 js와 마찬가지로 갑충 작용을 하는 PHP 프레임워크입니다
명령줄에서 PHP 프로그램을 시작하여 Listen이 지정한 포트의 웹 서버가 됨
easywoole 자체가 v3인데 이번에는 v2 이야기예요.

ISUCON의 초기 설치


ISUCON의 PHP 초기 설치는 Slim3 프레임워크에서 수행됨
이스우얼이 퍼포먼스가 있다면 내년 아이스콘이 슬림3에서 이스우얼로 바뀌어 예선을 돌파하는 것도 꿈이 아니다.
따라서 전략으로 슬림3의 초기 실시부터 easywoole로 간단하게 개작해야 한다

Slim3 -> easyswoole


원본 파일을 왼쪽에서 오른쪽으로 복사하고 이동하려면 처음에 라우트를 사용자정의하는 메커니즘 로우트에 주목했습니다.php
기술 예시를 실제로 소개하다.
Slim3
app.php
$app->get('/initialize', function (Request $request, Response $response): Response {
  exec('../../db/init.sh');

  return $response->withStatus(204);
});
easyswoole
Router.php
$routeCollector->get('/initialize', function (Request $request, Response $response) {
  exec('../../db/init.sh');

  $response->withStatus(204);
  $response->end();
});
할 수 있어.나도 그렇게 생각할 때가 있어.

질문(1)


easywoole의 프로세스가 계속 시작되고 있습니다.보통 PHP는 모델-php 또는 php-fpm로 이동하면 이 두 메모리 공간은 요구에 따라 다르다
그러나 easywoole 프로그램은 계속 시작되어 요청 공유 메모리를 뛰어넘을 수 있습니다
일반적인 웹 응용 프로그램처럼 세션을 만들고 사용자마다 세션 정보에 따라 분리해서 처리하지만 로터.php는 원래 루트를 진행할 때 보존해야 하는 파일이기 때문에Session 정보를 정확하게 처리할 수 없습니다.
구체적으로 말하면 로터.php로 생성된 세션은 모든 요청한 사용자에게 같은 세션을 공유합니다
애플리케이션이 제대로 작동하지 않음
그래서 최초의 전략으로 이맘때 간단한 교체를 포기했다.
easywoole의 표준 디렉터리 구성에 따라 Controller를 만들면 세션은 모든 사용자에게 독립할 수 있습니다.

질문(2)


easywoole에서 준비한 MySQL의 포장에 거래가 이루어지지 않았다(begin,commiit,rollback)
이스웰이 준비한 MySQL의 자물쇠를 억지로 사용할 필요는 없다고 생각합니다.
그러나 easyswoole에서 준비한 MySQL의 잠금 메모리는 연결 밴드 링을 설치하여 상주 과정의 장점을 이용하여 디자인한 것으로 동시 요청 수가 증가할 때 효과적으로 분리할 수 있다.
이걸 안 쓰는 손이 없으니까 거래 부분은 자기가 하는 거야
Mysql.php
    function begin() {
        $this->client->begin();
        $this->isTransaction = true;
    }

    function commit() {
        if ($this->isTransaction) {
            $this->client->commit();
        }
        $this->isTransaction = false;
    }

    function rollback() {
        if ($this->isTransaction) {
            $this->client->rollback();
        }
        $this->isTransaction = false;
    }

이 녀석은 움직일 수 있다


여러 가지 질문을 거쳐 이스우얼이 드디어 행동을 시작했다

기준의 결과는 어떠한가!


그나저나 LT에서는 중요한 결과를 말하지 못했다

드디어 기준이 "pass"로 바뀌었습니다!
・・・
스코어가 어떻게 됩니까?




242?

해설


초기 장착 벤치
얼마나 아름다운 장식인가!
위인에게는 이해할 수 없다!
이번에는 초기에 설치한 슬림3을 이스우올에 완전히 이식해서 벤치에 놓을 수밖에 없어요.
따라서 easywoole의 특징은 비동기와 코르크를 사용할 정도에 이르지 못했다
그러나 이번 ISUCON 문제의 성격상 비동기식 처리에서 거의 이점이 없는 것은 좋은 문제이다
easywoole의 장점을 확인하기 전에 배우지 못했지만 교체하는 기교를 배웠다
내년 아이스콘이 이즈우올을 이긴다!

최종 참고 실현


일단 이번 기준이 통과된 소스를 넣고요.
https://github.com/shirai-suguru/isucon8-easyswoole/tree/easyswoole-modify

좋은 웹페이지 즐겨찾기