对于Yii应用程序,资产和受保护/运行时文件夹是特殊的。首先,这两个文件夹必须存在并可由服务器(httpd)进程写入。其次,这两个文件夹包含临时文件,应该被git忽略。如果这些临时文件已提交,则在普通服务器(而不是Openshift服务器)中进行部署会导致git合并冲突。所以我就把这两个文件夹中的.gitignore:
php/assets/
php/protected/runtime/
在我的部署,我添加了一个shell脚本,通过openshift调用,创建在$ OPENSHIFT_DATA_DIR这两个文件夹,并创建应用程序的文件夹符号链接到他们两个。这是壳脚本(.openshift/action_hooks /部署),其余适于从here的内容:
#!/bin/bash
if [ ! -d $OPENSHIFT_DATA_DIR/runtime ]; then
mkdir $OPENSHIFT_DATA_DIR/runtime
fi
# remove symlink if already exists, fix problem when with gears > 1 and nodes > 1
rm $OPENSHIFT_REPO_DIR/php/protected/runtime
ln -sf $OPENSHIFT_DATA_DIR/runtime $OPENSHIFT_REPO_DIR/php/protected/runtime
if [ ! -d $OPENSHIFT_DATA_DIR/assets ]; then
mkdir $OPENSHIFT_DATA_DIR/assets
fi
rm $OPENSHIFT_REPO_DIR/php/assets
ln -sf $OPENSHIFT_DATA_DIR/assets $OPENSHIFT_REPO_DIR/php/assets
外壳脚本可以确保上openshift部署后各齿轮所创建的临时文件夹中。默认情况下,一个新目录的权利是u + rwx,并且它由httpd进程写入,因为齿轮运行httpd作为齿轮用户(不是apache或其他)。