클라이언트 측 PHP
본문
프론트 엔드에서 자바 스크립트를 사용하는 많은 사이트를 방문했다고 확신하지만 클라이언트 측 언어로 PHP를 사용하는 것은 어떻습니까? 어떻게 물어? PHP는 C 기반이기 때문에 실제로 웹 어셈블리를 사용하여 웹 브라우저에서 실행할 수 있는 버전을 컴파일 할 수 있습니다.
좋은 생각입니까? 알아 보자!
https://atymic.dev/blog/client-side-php/
PHP를 웹 어셈블리로 컴파일
브라우저 용 PHP 컴파일은 실제로 생각하기 어렵지 않습니다. Oraoto의 컴파일 스크립트를 사용하면 PHP가 서버 또는 CLI에서와 같이 작동하는 PHP wasm 빌드를 얻는 것이 매우 쉽습니다.
브라우저의 컬렉션, jsfiddle 스타일과 관련하여 뭔가를 만들면 브라우저에서 PHP를 확인하고 멋진 것을 만들 수 있는 좋은 기회처럼 보입니다.
Github에서 리포지토리를 확인하고 여기에서 직접 사용해 볼 수 있습니다.
작동 원리
Vue에서 입력 json 및 컬렉션 코드를 받는 작은 PHP 패키지를 만들었습니다. 코드는 Laravel의 컬렉션 구성 요소 코드와 함께 phar (php 실행 파일)로 컴파일 됩니다.
단순히 json을 콜렉션으로 변환 한 다음 eval을 사용하여 제공된 콜렉션 코드를 실행합니다. 결과 또는 오류 (예외 또는 예외 처리 가능)는 json으로 다시 인코딩되어 인쇄됩니다. 자바 스크립트로 돌아가서, 우리는 PHP의 stdout을 연결하고 실행 결과를 사용자에게 다시 표시합니다.
PWA 지원 덕분에 인터넷 없이도 사용할 수 있습니다.
클라이언트 쪽에서 Laravel을 실행할 수 있다면 어떨까요?!
쿨, 우리는 PHP 코드를 실행하는 것을 만들었지 만 컬렉션은 매우 간단합니다. Laravel에 완전히 내장 된 전체 웹 애플리케이션을 실행할 수 있다면 어떨까요? 서버리스가 아닙니다
TodoMVC 프로젝트는 종종 프레임 워크를 테스트하는 데 사용되기 때문에 시도해보고 실행하는 것이 좋습니다.
우리가 해결해야 할 첫 번째 장애물은 Laravel에 요청하는 것입니다. 웹 서버가 실행 중이 아니기 때문에 웹 요청 만 사용할 수는 없습니다.
해키 할 시간! 실제로 통합 테스트에서 프레임 워크를 실행하는 방법과 유사한 모의 PSR7 요청으로 프레임 워크를 실행할 수 있습니다. 코드를 실행하여 PHP 와만 상호 작용할 수 있으므로 프레임 워크 요청 주기를 함수로 래핑 했습니다.
function run(string $requestAsJson, string $requestId) { $requestData = json_decode($requestAsJson, true); require __DIR__ . '/bootstrap/autoload.php'; $app = require_once __DIR__ . '/bootstrap/app.php'; $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); $_SERVER['CONTENT_TYPE'] = 'application/json'; $request = \Illuminate\Http\Request::create( $requestData['uri'], $requestData['method'], $requestData['params'] ?? [], $requestData['cookies'] ?? [], [], $_SERVER, $requestData['body'] ?? null ); /** @var \Illuminate\Http\Response $response */ $response = $kernel->handle($request); echo json_encode([ 'id' => $requestId, 'status' => $response->getStatusCode(), 'content' => $response->getContent(), 'headers' => $response->headers->all(), ]); $kernel->terminate($request, $response); }
콘솔에서 빠른 테스트를 수행 한 후 작동하는지 확인한 후 Laravel과 모든 종속 항목을 phar에 번들로 묶어 (가상 파일의 가상 파일 시스템이 많은 파일을 제대로 처리하지 못함) 웹 어셈블리 바이너리에 빌드 할 수 있습니다.
laravel에게 SQlite를 사용하도록 지시 했으므로 애플리케이션 상태는 (가짜) 요청 간에 지속될 수 있습니다. 그러나 스토리지는 일시적인 것이므로 다시 로드 할 때마다 재설정 됩니다.
브라우저 콘솔에서 테스트하여 새로운 할 일 항목을 추가하고 index 메소드에 요청할 수 있습니다.
function request(data) { const reqId = Math.random().toString(36).substring(7); const code = `$phar = 'phar://app.phar';require $phar . '/index.php';run('${JSON.stringify(data)}', '${reqId}');echo PHP_EOL;`; const ret = phpModule.ccall('pib_eval', 'number', ['string'], [code]); } // Add a todo item request({ uri: '/api', method: 'POST', body: JSON.stringify({ title: 'do washing' }) }) // Get the todo list request({ uri: '/api', method: 'GET' }) { "status": 200, "content": "[{\"id\":1,\"title\":\"do washing\",\"order\":null,\"completed\":false,\"created_at\":\"2019-10-06 07:25:29\",\"updated_at\":\"2019-10-06 07:25:29\",\"url\":\"\\\/1\"}]", "headers": { "cache-control": [ "no-cache, private" ], "content-type": [ "application\/json" ], "date": [ "Sun, 06 Oct 2019 07:25:53 GMT" ], "x-ratelimit-limit": [ "60" ], "x-ratelimit-remaining": [ 59 ], } }
결론
브라우저에서 PHP를 사용하는 것은 재미 있지만, 사용하기에는 먼 길입니다. 다음은 단점이 아닌 철저한 목록입니다.
- 일반적으로 PHP보다 약 5 배 느립니다.
- 시작시> 1GB의 메모리를 사용하므로 저가형 장치가 작동하지 않습니다
- 신 데스크톱 버전의 Chrome, Firefox 및 Safari에서만 작동합니다.
- wasm 빌드를 컴파일하는 데 오랜 시간이 걸리며 모든 코드 변경에 필요합니다.
- 자바 스크립트로는 할 수 없는 일을 할 수 없습니다. 이것은 웹 요청이 없다는 것을 의미하며, 이는 잠재적 인 톤을 제한합니다
- 약 4mb에 나오는 전체 PHP 빌드 + 코드 (클라이언트 측을 캐싱하지 않는 한)를 다운로드 해야 합니다.
- 때로는 작동하지 않기로 결정하고 디버깅 하기가 어렵습니다. PHP의 종료 코드와 별개로 볼 수 없습니다
분명히, 그것은 실제 사용에는 적합하지 않지만, 아마도 클라이언트 측을 위해 PHP 코드를 작성할 수 있을 것입니다.
- 이전글PHP 실행 연산자 19.10.14
- 다음글Python을 사용하여 자신의 블록 체인을 만드는 방법 19.10.14