zendstudio 使用外部composer

系统:

MacOS 10.12.6

ZendStudio 使用外部composer有个讲究,应该使用/usr/local/Cellar/composer/1.4.2/libexec/composer.phar文件而不应该使用/usr/local/Cellar/composer/1.4.2/libexec/composer,因为composer是个shell脚本,会干一些事情,比如定义环境变量等等,会导致一系列的错乱,例如下面的错误:

Failed loading /Applications/Zend Studio.app/Contents/Eclipse/plugins/com.zend.php.executables.macosx_7.1.3.201703171134/resources/ext/ZendDebugger.so:  dlopen(/Applications/Zend Studio.app/Contents/Eclipse/plugins/com.zend.php.executables.macosx_7.1.3.201703171134/resources/ext/ZendDebugger.so, 9): Library not loaded: /usr/local/openssl-1.0.2k/lib/libssl.1.0.0.dylib
  Referenced from: /Applications/Zend Studio.app/Contents/Eclipse/plugins/com.zend.php.executables.macosx_7.1.3.201703171134/resources/ext/ZendDebugger.so
  Reason: image not found

由于使用composer脚本导致/usr/local/openssl-1.0.2k/lib/libssl.1.0.0.dylib找不到,正确位置应该是:

/Applications/Zend Studio.app/Contents/Eclipse/plugins/com.zend.php.executables.macosx_7.1.3.201703171134/resources/libssl.1.0.0.dylib

使用composer.phar解决问题。

ps:使用外部composer和中国镜像会有一系列的好处。

nginx fastcgi 通用配置

通用配置文件php和php_rewrite放在和nginx.conf同级目录。

php:

location ~* \.php($|/) {
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME   $fastcgi_file;
        fastcgi_param SERVER_NAME       $server_name;
        fastcgi_param PATH_INFO         $fastcgi_script_name;
}

php配置使用了自定义变量$fastcgi_file。

php_rewrite

if (!-e $request_filename) {
    rewrite  ^/(.*)$  /index.php/$1;
}
set $fastcgi_file $document_root$fastcgi_script_name;
include php;

使用自定义变量$fastcgi_file。

常规server配置

server {
    listen 80;
    server_name xxx.com;
    root /srv/www/xxx.com/public;

    include php_rewrite;
}

带location的server配置

server {
    listen 80;
    server_name xxx.com;

    location /v1 {
        root /srv/www/xxx.com-v1/public/;
        include php_rewrite;
    }
    location /v2 {
        root /srv/www/xxx.com-v2/public/;
        include php_rewrite;
    }
    include php;
}

这个配置就有很多说法了,以location /v1为例,包含文件php_rewrite中include php语句不会起作用,包含文件php_rewrite中的rewrite ^/(.*)$ /index.php/$1会重写uri到/,然后匹配server下配置文件php中的location,因为位于/并且在/下没有定义root和alias所以$document_root使用默认值,例如:/etc/nginx/html,为了避免这种情况可以使用自定义变量保存fastcgi_param SCRIPT_FILENAME,正如代码中的$fastcgi_file变量。

其中rewrite有需要特别注意的地方:last和break
这两个参数官方文档写的不是很容易理解,参考资料:http://blog.csdn.net/brainkick/article/details/7475770

下面是更高级的配置:

server {
    listen 80;
    server_name local.api.1crud.com;

    access_log /var/log/nginx/api.1crud.com_access.log;
    error_log /var/log/nginx/api.1crud.com_error.log;

    location ~ ^/(?<version>v\d+) {
        root /srv/www/api.1crud.com-$version/public;
        include php_rewrite;
    }
    include php;
}

location和rewrite中的正则匹配可以后向引用,实例中使用的是带名称的后向引用,如果直接使用$1,$2之类的后向引用会出问题,因为root命令决定了$document_root变量的值,但是$document_root变量的值是在使用时动态计算的,所以使用$document_root之前如果有带子匹配的其他正则会导致$document_root的值和root命令期望的值不一样。