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命令期望的值不一样。

php数组遍历引用

$a=[1,2,3];
foreach($a as &$v){
    $v*=2;
}
foreach($a as $v){
}
var_dump($a);
array(3) {
  [0]=>
  int(2)
  [1]=>
  int(4)
  [2]=>
  &int(4)
}

解释:

第一个循环完成之后别名$v指向了数组的最后一个元素等价于:

$v=6;
$a[2]=&v;

第二个循环一共有三次,每一次都给$v进行赋值操作,也就是每次都给$a[2]进行赋值操作,第一次循环的时候$a[2]=2,第二次循环$a[2]=4,第三次循环相当于把$a[2]的值赋给$a[2],所以还是4。

所以别名(引用)用完之后要记得unset掉,正确代码如下:

$a=[1,2,3];
foreach($a as &$v){
    $v*=2;
}
unset($v);
foreach($a as $v){
}
var_dump($a);