GAE下运行php

一、基础

这之前你可能需要下载 google cloud sdk

二、实操

2.1 在gae php环境输出hello world!

1
2
3
4
5
6
7
8
9
10
11
12
TUTORIALDIR=src/lks-rss/php_gae_quickstart_editor-2018-06-07-13-08
git clone https://github.com/GoogleCloudPlatform/appengine-php-guestbook.git $TUTORIALDIR
cd $TUTORIALDIR
git checkout phase0-helloworld
dev_appserver.py --php_executable_path=/usr/bin/php-cgi $PWD # 在cloud shell上测试
gcloud app create # 创建应用
gcloud app deploy app.yaml --project lks-rss # 部署应用
curl 'https://lks-rss.appspot.com/'

2.2 google cloud sdk 使用

说明:在国内登陆google登陆的过程最好使用vpn,或者全局代理,如果在terminal中配置代理可能导致登陆失败!
or 使用gcloud代理配置:

1
2
3
4
5
6
gcloud config set proxy/type PROXY_TYPE
gcloud config set proxy/address PROXY_IP_ADDRESS
gcloud config set proxy/port PROXY_PORT
gcloud config set proxy/username USERNAME
gcloud config set proxy/password PASSWORD
1
2
3
4
5
gcloud init --skip-diagnostics # 初始化并登陆Google账户,选择一个工程
gcloud auth login #进行登录
gcloud projects list # 列出当前账号的所有工程列表。
gcloud config set project my-project # 可以选择另外一个工程。
gcloud app browse # 来查看工程的显示效果

遇到问题:

  1. 登陆验证失败,提示:ERROR: gcloud crashed (SSLHandshakeError): [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661)

  2. gdk yaml配置问题
    在 app.yaml 文件所在目录下,使用 gcloud app deploy 来发布当前目录工程。 app.yaml文件和Google App Engine SDK使用的yaml文件略有不同,要删除最开头的两行。

三、sdk设置

3.1 在idea中配置google cloud sdk

配置设定sdk的路径,然后会提醒

The Cloud SDK does not contain the app-engine-java component. To install, run “gcloud components install app-engine-java”

我一般会执行以下命令去更新

  • gcloud components install app-engine-java
  • gcloud components install app-engine-php

四、配置文件

4.1 app.yaml

4.2 cron.yaml 定时脚本

项目根目录配置文件:

1
2
3
4
cron:
- description: "gen juejin rss"
url: /rss/juejin.rss.php
schedule: every 20 mins

gcloud app deploy cron.yaml

五、storage使用

获取公开的文件配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
$options = [
'gs' => [
'acl' => 'public-read', // 设置文件未公开状态
'Content-Type' => 'text/plain', // 指定文件类型
],
];
$context = stream_context_create($options);
$fileName = "gs://${my_bucket}/public_file.txt";
file_put_contents($fileName, $publicFileText, 0, $context);
$publicUrl = CloudStorageTools::getPublicUrl($fileName, false);
$fileContents = file_get_contents($filePath); // 获取文件内容