PHP์šฉ ๊ธฐ์กด ๋ฒˆ๋“ค ์„œ๋น„์Šค์— ์•ก์„ธ์Šค

์ด ํŽ˜์ด์ง€์—์„œ๋Š” App Engine ํ‘œ์ค€ ํ™˜๊ฒฝ์— ๋Œ€ํ•ด PHP ๋Ÿฐํƒ€์ž„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒˆ๋“ค ์„œ๋น„์Šค๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์€ PHP์šฉ App Engine ์„œ๋น„์Šค SDK๋ฅผ ํ†ตํ•ด ๋ฒˆ๋“ค ์„œ๋น„์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

  1. PHP ๋Ÿฐํƒ€์ž„์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์กด ๋ฒˆ๋“ค ์„œ๋น„์Šค API ๋ชฉ๋ก์„ ์ฐธ์กฐํ•˜์„ธ์š”.

  2. ๋‹ค์Œ ์ค„์„ ํฌํ•จํ•˜๋„๋ก app.yaml ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

    app_engine_apis: true
    
  3. PHP ์•ฑ์„ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด gcloud app deploy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

PHP App Engine SDK ์„ค์น˜

PHP App Engine SDK๋Š” GitHub์˜ appengine-php-sdk์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, PHP 8.1+์—๋Š” ๋ฒ„์ „ 2.1 ์ด์ƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ PHP 7.x์—๋Š” ๋ฒ„์ „ 2.0.1 ์ด์ƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์— SDK๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Packagist ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ composer.json ํŒŒ์ผ์— SDK๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    composer require google/appengine-php-sdk
    
  2. ๋‹ค์Œ ์„ธ๋ถ€์ •๋ณด๊ฐ€ ํฌํ•จ๋œ composer.json ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    PHP 7/8

    {
        "require": {
            "google/appengine-php-sdk": "^2.1" // Or any later version
        }
    }
    

PHP์—์„œ App Engine API๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ช…์‹œ์ ์ธ ์ข…์† ํ•ญ๋ชฉ ์‚ฌ์–‘์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. autoload.php๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ด ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ€์ ธ์˜ค๊ธฐ

use ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ API ๋ชฉ๋ก์—์„œ ํ•„์š”ํ•œ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ Google\AppEngine\Api\AppIdentity\ClassName์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

use Google\AppEngine\Api\AppIdentity\ClassName;

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณ ๋ ค์‚ฌํ•ญ

์•ฑ ID

PHP๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ๋Š” ์•ฑ ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. App Identity API์˜ ๋™์ž‘, ๊ธฐ๋Šฅ, ์„ค์ • ์•ˆ๋‚ด๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ API ID ๊ฐœ์š” ๋ฐ App Identity API ์ฐธ์กฐ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฉ”์ผ

PHP Mail API๋Š” PHP 5 Mail API์™€ ๋Œ€๋ถ€๋ถ„ ๋™์ผํ•˜์ง€๋งŒ ๋ฉ”์ผ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๊ณ  ์ค‘์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์•ฝ๊ฐ„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๋‘ ๋Ÿฐํƒ€์ž„ ๊ฐ„์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€ ํด๋ž˜์Šค

PHP์—์„œ Message ํด๋ž˜์Šค๋Š” PHP 5.5์™€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ use ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋‹ค๋Š” ์ ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ฐจ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

PHP 5.5

use google\appengine\api\mail\Message;

PHP 7/8

use Google\AppEngine\Api\Mail\Message;

๊ฐ€์ ธ์˜ค๊ธฐ ๋ฌธ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฉด ์›๋ž˜ PHP 5.5 ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฌธ๋„ PHP์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

Mail ํ•จ์ˆ˜

PHP 5.5์—์„œ๋Š” App Engine์˜ Mail ํ•จ์ˆ˜์— ์˜ํ•ด ๊ธฐ๋ณธ PHP mail() ํ•จ์ˆ˜๊ฐ€ ์˜ค๋ฒ„๋กœ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

PHP์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ App Engine Mail ํ•จ์ˆ˜๊ฐ€ ๋” ์ด์ƒ ์˜ค๋ฒ„๋กœ๋“œ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด ํ•จ์ˆ˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ƒˆ๋กœ์šด ๋™์ž‘์„ ํ†ตํ•ด ํ•„์š”์— ๋งž๊ฒŒ Mail ํ•จ์ˆ˜์˜ ์šฉ๋„๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋“  Mail ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ ๊ตฌํ˜„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ PHP mail() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ App Engine Mail API๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”์ผ์„ ๋ณด๋‚ด๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด php.ini ํŒŒ์ผ์—์„œ ์ด๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

extension = mailparse.so
sendmail_path = "php ./vendor/google/appengine-php-sdk/src/Runtime/SendMail.php -t -i"

์•ž์˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด mailparse ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ธฐ๋ณธ PHP ๋ฉ”์ผ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๊ณ  sendmail_path ๋Ÿฐํƒ€์ž„ ๊ตฌ์„ฑ์„ App Engine Mail ํ•จ์ˆ˜ ๊ตฌํ˜„์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ฉด mail()์— ๋Œ€ํ•œ ๋ชจ๋“  ํ˜ธ์ถœ์ด PHP 5.5์—์„œ์™€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฉ”์ผ ๋ณด๋‚ด๊ธฐ ๋ฐ ๋ฉ”์ผ ์ˆ˜์‹  ๊ฐ€์ด๋“œ์™€ Mail API ์ฐธ์กฐ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Memcache

PHP์šฉ Memcache๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Memcache ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ช…์‹œ์  ์„ ์–ธ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์—๋Š” PHP 5.5์šฉ Memcache์— ๋ช…์‹œ์ ์ธ ์„ ์–ธ์ด ํ•„์š”ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ช…์‹œ์ ์ธ ์„ ์–ธ์„ ํ†ตํ•ด ๊ธฐ๋ณธ PHP Memcache์™€ App Engine Memcache ๊ฐ„์— ์œ ์—ฐํ•˜๊ฒŒ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PHP Memcache ํด๋ž˜์Šค ๋™์ž‘์€ PHP 5 Memcache ํด๋ž˜์Šค ๋™์ž‘๊ณผ ๊ฐ™์ง€๋งŒ ๋ช…์‹œ์ ์ธ ์„ ์–ธ์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Memcache ๊ฐœ์š”๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

PHP 5.5

PHP 5.5์šฉ Memcache ์˜ˆ์‹œ:

$memcache = new Memcache();
return $memcache->get($key);

PHP 5.5์šฉ Memcached ์˜ˆ์‹œ:

$memcache = new Memcached();
$memcache->set('who', $request->get('who'));
return $twig->render('memcache.html.twig', [
    'who' => $request->get('who'),
    'count' => $memcache->increment('count', 1, 0),
    'host' => $request->getHost(),
]);

PHP 7/8

PHP์šฉ Memcache API ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

use Google\AppEngine\Api\Memcache\Memcache;

$memcache = new Memcache();
return $memcache->get($key);

PHP์šฉ Memcached API ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

use Google\AppEngine\Api\Memcache\Memcached;

$memcache = new Memcached();
$memcache->set('who', $request->get('who'));
return $twig->render('memcache.html.twig', [
    'who' => $request->get('who'),
    'count' => $memcache->increment('count', 1, 0),
    'host' => $request->getHost(),
]);

PHP์—์„œ PHP 5์šฉ Memcache์˜ ์›๋ž˜ ๋™์ž‘์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด composer.json ํŒŒ์ผ์— ๋ช‡ ์ค„์„ ๋” ์ถ”๊ฐ€ํ•˜์—ฌ Memcache๋ฅผ ์•”์‹œ์ ์œผ๋กœ ๊ณ„์† ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. Composer์—์„œ appengine-php-sdk ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„ autoload ์„น์…˜์˜ files ์š”์†Œ์— ๋‹ค์Œ ์„ ํƒ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

PHP 7/8

{
  "require": {
    "google/appengine-php-sdk": "^2.1" // Or any later version
  },
  "autoload": {
    "files": [
    "./vendor/google/appengine-php-sdk/src/Api/Memcache/MemcacheOptIn.php"
    ]
  }
}

๋ชจ๋“ˆ

PHP๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ๋Š” ์•ฑ ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Modules API์˜ ๋™์ž‘, ๊ธฐ๋Šฅ, ์„ค์ • ์•ˆ๋‚ด๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ชจ๋“ˆ ๊ฐœ์š” ๋ฐ ๋ชจ๋“ˆ API ์ฐธ์กฐ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์„ธ์…˜

PHP ์„ธ์…˜์€ PHP 5.5 ์„ธ์…˜๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ PHP 5.5 ์„ธ์…˜์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ MemcacheSessionHandler ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋ฏ€๋กœ ์„ค์ • ์•ˆ๋‚ด๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

PHP์šฉ ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด session_set_save_handler()๋กœ MemcacheSessionHandler ํด๋ž˜์Šค๋ฅผ ๋“ฑ๋กํ•˜๊ณ  Memcache์— session.save_path๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Memcache ์ •๋ณด์— ์•ก์„ธ์Šคํ•  ๋•Œ Memcache์— ์ˆ˜์‹  ๋™์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

PHP 7/8

ini_set('session.save_path', 'Google\AppEngine\Api\Memcache\Memcache');
session_set_save_handler(new Google\AppEngine\Ext\Session\MemcacheSessionHandler(), true);

์ž์„ธํ•œ ๋‚ด์šฉ์€ Session API ์ฐธ์กฐ ๊ฐ€์ด๋“œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

ํƒœ์Šคํฌ ํ

PHP๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ๋Š” ์•ฑ ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํƒœ์Šคํฌ ํ์˜ ๋™์ž‘, ๊ธฐ๋Šฅ, ์„ค์ • ์•ˆ๋‚ด๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํƒœ์Šคํฌ ํ ๊ฐœ์š” ๊ฐ€์ด๋“œ์™€ Task Queue API ์ฐธ์กฐ ๊ฐ€์ด๋“œ์˜ ์„ธ์…˜ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

URL ๊ฐ€์ ธ์˜ค๊ธฐ

PHP์šฉ URL Fetch๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด URL Fetch ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ช…์‹œ์  ์„ ์–ธ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์—๋Š” PHP 5์šฉ URL Fetch ์„œ๋น„์Šค์— ๋ช…์‹œ์  ์„ ์–ธ์ด ํ•„์š”ํ•˜์ง€ ์•Š์•˜๊ณ  ์•”์‹œ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

PHP 5์—์„œ App Engine์˜ URL Fetch ์„œ๋น„์Šค๋Š” PHP 5.5์—์„œ ์ธํ„ฐ๋„ท ์ฝ˜ํ…์ธ ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋ฏ€๋กœ ์ธํ„ฐ๋„ท์— ์•ก์„ธ์Šคํ•œ ๋Œ€๋ถ€๋ถ„์˜ PHP 5.5 ํ•จ์ˆ˜์—๋Š” UrlFetch๊ฐ€ ์‚ฌ์šฉ๋˜๋„๋ก ์ž๋™์œผ๋กœ ํŒจ์น˜๊ฐ€ ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

PHP์—์„œ๋Š” ๊ธฐ๋ณธ PHP ๋„คํŠธ์›Œํ‚น์ด ์ธํ„ฐ๋„ท์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด ์ž๋™ ํŒจ์น˜๋Š” ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ฒฝ์šฐ์—๋Š” ์›๋ž˜ UrlFetch ๋ฉ”์ปค๋‹ˆ์ฆ˜, ํŠนํžˆ App Engine ์•ฑ์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” App Engine ์•ฑ์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ X-Appengine-Inbound-Appid ์š”์ฒญ ํ—ค๋”๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PHP์šฉ URL Fetch๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ ค๋ฉด ์ŠคํŠธ๋ฆผ ๋ž˜ํผ์—์„œ ๋ช…์‹œ์  ์„ ์–ธ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์„น์…˜์—์„œ ์„ค๋ช…ํ•˜๋Š” UrlFetch ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์˜ต์…˜ 1a ์ŠคํŠธ๋ฆผ ํ•ธ๋“ค๋Ÿฌ

App Engine์˜ URL Fetch ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜์—ฌ http:// ๋ฐ https:// PHP ์ŠคํŠธ๋ฆผ ํ•ธ๋“ค๋Ÿฌ์— HTTP ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. stream_wrapper_unregister()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTP(S)์˜ ๊ธฐ๋ณธ PHP ์ŠคํŠธ๋ฆผ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋ก ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค.
  2. stream_wrapper_register()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTP(S)๋ฅผ UrlFetchStream ํด๋ž˜์Šค์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
  3. ์ŠคํŠธ๋ฆผ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ตฌ์„ฑ์œผ๋กœ file_get_contents()๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
    • URL Fetch ์„œ๋น„์Šค์—์„œ ๊ธฐ๋ณธ PHP ์ŠคํŠธ๋ฆผ ํ•ธ๋“ค๋Ÿฌ๋กœ ๋‹ค์‹œ ์ „ํ™˜ํ•˜๋ ค๋ฉด stream_wrapper_unregister()๋ฅผ ์‚ฌ์šฉํ•œ ํ›„ stream_wrapper_restore()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

๋น„๊ต๋Š” PHP 5 ๋ฐ PHP์— ํ•ด๋‹นํ•˜๋Š” ์˜ˆ์‹œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

PHP 5.5

...
$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);

// Using Url Fetch service. No option to use the native php stream wrapper.
$result = file_get_contents('http://example.com', false, $context);
echo $result;

PHP 7/8

use google\appengine\api\urlfetch\UrlFetchStream;
...
$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);

// Using the native php stream wrapper.
$result = file_get_contents('http://example.com', false, $context);
echo $result;

stream_wrapper_unregister("http");
stream_wrapper_register("http", "UrlFetchStream");

// Now using the Url Fetch service.
$result = file_get_contents('http://example.com', false, $context);
echo $result;

stream_wrapper_unregister("http");
stream_wrapper_restore("http");

// Now using the native php stream wrapper again.

์˜ต์…˜ 1b ์ŠคํŠธ๋ฆผ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์žˆ๋Š” HTTP ์‘๋‹ต ํ—ค๋”

์ŠคํŠธ๋ฆผ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์žˆ๋Š” HTTP(S) ์‘๋‹ต ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ŠคํŠธ๋ฆผ ํ•ธ๋“ค๋Ÿฌ ์‚ฌ์šฉ ์•ˆ๋‚ด์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

  1. stream_wrapper_unregister()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTP(S)์˜ ๊ธฐ๋ณธ PHP ์ŠคํŠธ๋ฆผ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋ก ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค.
  2. stream_wrapper_register()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ UrlFetchStream ํด๋ž˜์Šค์— HTTP(S)๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
  3. ์›ํ•˜๋Š” ๊ตฌ์„ฑ์œผ๋กœ file_get_contents() ๋Œ€์‹  fopen()์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  4. stream_get_meta_data()๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  'wrapper_data์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ์ƒ‰์ธ์„ ์ƒ์„ฑํ•˜์—ฌ ์‘๋‹ต ํ—ค๋” ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. ์‘๋‹ต ํ—ค๋”๋Š” PHP 5.5์˜ $http_response_header์™€ ์œ ์‚ฌํ•œ ๋ฐฐ์—ด ํ˜•์‹์œผ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

PHP 5.5

...
$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);

// Using file_get_contents and the Url Fetch service.
$result = file_get_contents('http://example.com', false, $context);

// Print Http Response Headers
print_r($http_response_header);

PHP 7/8

use google\appengine\api\urlfetch\UrlFetchStream;
...
$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);

stream_wrapper_unregister("http");
stream_wrapper_register("http", "UrlFetchStream");

// Now using fopen and the Url Fetch service.
$result = fopen('http://example.com', 'r', false, $context);

// Print Http Response Headers
$meta_data = stream_get_meta_data($result);
$headers = $meta_data['wrapper_data'];
print_r($headers);

stream_wrapper_unregister("http");
stream_wrapper_restore("http");

์˜ต์…˜ 2. UrlFetch ํด๋ž˜์Šค

UrlFetch ํด๋ž˜์Šค๋Š” HTTP(S) ์š”์ฒญ์— ๋” ์ž‘์€ ๋ฒ”์œ„์—์„œ URL Fetch ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š”, ๋” ํƒ€๊ฒŸํŒ…๋œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ์ปค์Šคํ…€ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆผ ํ•ธ๋“ค๋Ÿฌ ์˜ต์…˜๊ณผ ๋‹ฌ๋ฆฌ UrlFetch ํด๋ž˜์Šค๋Š” URL Fetch ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ŠคํŠธ๋ฆผ ๋ž˜ํผ ํ˜ธํ™˜ ํ•จ์ˆ˜์—์„œ ์ˆ˜ํ–‰๋œ ๋ชจ๋“  HTTP(S) ์š”์ฒญ์„ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆผ ํ•ธ๋“ค๋Ÿฌ ์˜ต์…˜๊ณผ ๋น„๊ตํ•˜์—ฌ UrlFetch ํด๋ž˜์Šค ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ PHP API๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

  • stream_context_create()
  • stream_wrapper_unregister()
  • stream_wrapper_register()
  • file_get_contents()

๋‹ค์Œ UrlFetch ํด๋ž˜์Šค ์˜ˆ์‹œ๋Š” ์ŠคํŠธ๋ฆผ ํ•ธ๋“ค๋Ÿฌ ์˜ˆ์‹œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

PHP 7/8

use google\appengine\api\urlfetch\UrlFetch;
...
$urlfetch = new UrlFetch();
$result = $urlfetch->fetch($url, 'POST', $headers, http_build_query($data));
echo $result->getContent();

์‚ฌ์šฉ์ž

PHP๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ๋Š” ์•ฑ ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Users API์˜ ๋™์ž‘, ๊ธฐ๋Šฅ, ์„ค์ • ์•ˆ๋‚ด๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Users API ๊ฐœ์š” ๋ฐ Users API ์ฐธ์กฐ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

PHP๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ datastore์šฉ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋ถ€ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐํƒ€ ๊ณ ๋ ค์‚ฌํ•ญ

  • PHP ์•ฑ์—์„œ ๊ธฐ์กด ๋ฒˆ๋“ค ์„œ๋น„์Šค ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ๋กœ์ปฌ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. dev_appserver.py ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ๋•Œ --php_executable_path ์ธ์ˆ˜๋ฅผ PHP ์‹คํ–‰ ํŒŒ์ผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” php-cgi ์‹คํ–‰ ํŒŒ์ผ์ด ํ•„์š”ํ•œ PHP 5์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

    ํ”„๋กœ์ ํŠธ์— composer.json ํŒŒ์ผ์ด ์žˆ์œผ๋ฉด --php-composer-path๋ฅผ composer.phar ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ์•ฑ์„ ๋ฐฐํฌํ•˜๋ ค๋ฉด gcloud app deploy ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • PHP ๋Ÿฐํƒ€์ž„์˜ ๋กœ๊น…์€ Cloud Logging์˜ ๋กœ๊น… ํ‘œ์ค€์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. PHP ๋Ÿฐํƒ€์ž„์—์„œ ์•ฑ ๋กœ๊ทธ๋Š” ๋” ์ด์ƒ ์š”์ฒญ ๋กœ๊ทธ์™€ ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๋ ˆ์ฝ”๋“œ๋กœ ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋กœ๊ทธ ์“ฐ๊ธฐ ๋ฐ ๋ณด๊ธฐ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์˜ˆ์‹œ

PHP๋กœ ๊ธฐ์กด ๋ฒˆ๋“ค ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ ค๋ฉด ์ฝ”๋“œ ์ƒ˜ํ”Œ์„ ๋‹ค์šด๋กœ๋“œํ•˜์„ธ์š”.