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);

 

语义化版本(SemVer)的范围

在使用 Node.jsBower 的时候,其中的 package.jsonbower.json 都会有 dependenciesdevDependencies 项,对于此前端开 发的童鞋应该会比较熟悉。这里面是运行时和开发时依赖库,其中依赖库对应的版本号有很多种写法,诸如:”~1.0.2“, “^1.0“, “>=1.0.2“等,其实可以猜测这种写法代表了某种范围,至于具体含义本文给大家做详细解释。

语义化版本格式

我们首先简单了解一下语义化版本版本号,标准的版本格式为:X.Y.Z,其中:
X:主版本号,当我们做了不兼容或者颠覆性的更新,修改此版本号。
Y:此版本号,当我们做了向下兼容的功能性修改,修改此版本号。
Z:修订号,当我们做了向下兼容的问题修正,修改此版本号。
其中XYZ必须为非负整数,禁止数字前补零,每个数值都是递增的。

语义化版本范围

版本范围是一组满足指定范围的比较器,一个比较器是由操作符和版本号组成,下面是最原始的操作符:

  • < 小于;
  • <= 小于等于;
  • > 大于;
  • >= 大于等于;
  • = 等于;如果没有指定操作符,则默认为等于。

一个范围可由一个或者多个比较器组成,如果有多个,则由双竖线(||)连接。对于包含多个比较器,只要满足其一即可。比如:

  • 范围 >=1.2.7 <1.3.0 ,版本号 1.2.7, 1.2.8, 1.2.99 满足条件,而 1.2.6, 1.3.0, 1.1.0 确不满足。
  • 范围 1.2.7 || >=1.2.9 <2.0.0 ,版本号 1.2.7, 1.2.9, 1.4.6 满足,而 1.2.8  或者 2.0.0 不满足。

关于测试版

AlphaBetaGammaαβλ谐音,是希腊字母前三个字母,用来表示软件开发过程中测试的三个阶段:
Alpha:内测版,内部交流或者专业测试人员测试用;
Beta:公测版,专业爱好者大规模测试用,存在一些缺陷,该版本也不适合一般用户安装;
Gamma:比较成熟的测试版,与即将发行的正式版相差无几;
RC:是 Release Candidate 的缩写,意思是发布倒计时,候选版本,处于Gamma阶段,该版本已经完成全部功能并清除大部分的BUG。到了这个阶段只会除BUG,不会对软件做任何大的更改。从Alpha到Beta再到Gamma是改进的先后关系,但RC1、RC2往往是取舍关系。
Stable:稳定版。在开源软件中,都有stable版,这个就是开源软件的稳定发行版。

范围 >1.2.3-alpha.3,版本1.2.3-alpha.7符合条件,而3.4.5-alpha.9却不满足条件。虽然 3.4.5-alpha.9 实际上大于 1.2.3-alpha.3,但是根据 SemVer 的排序规则,这个版本范围只是接受 1.2.3 的测试版,而不接受其他版本的测试版。当然 3.4.5 满足条件,因为它不是测试版,并且大于 1.2.3-alpha.7

这么做是有两个目的,首先测试版会经常更新并且可能包含不适合公开的重大改动,因此被排除在范围之外;再者,虽然用户明确此次使用有风险的测试版本,然而下一版本的测试版被包含进来仍然是不合适的。

版本范围高级用法

在版本范围的高级用法中,与原始的比较器不同,组合不仅仅限于空格和双竖线,它有以下几种方式。

连接符(-)范围 X.Y.Z - A.B.C

下面表示的闭包集合

  • 1.2.3 - 2.3.4 := >=1.2.3 <=2.3.4

如果范围中的第一个版本号只有一部分,剩下的部分以零填充。

  • 1.2 - 2.3.4 := >=1.2.0 <=2.3.4

如果范围中的第二个版本号只有一部分,代表范围中包含了这个版本。

  • 1.2.3 - 2.3 :=  >=1.2.3 <2.4.0
  • 1.2.3 - 2 := >=1.2.3 <3.0.0

X范围 1.2.x 1.X 1.2.* *

X, x 或者 * 可以用在主版本号、此版本号以及修订版本号的任何一个上面。

  • * := >=0.0.0 (任何版本都满足)
  • 1.x := >=1.0.0 <2.0.0 (只要满足主版本号即可)
  • 1.2.x := >=1.2.0 <1.3.0 (需要满足主版本和此版本号)

部分版本号的含义与X范围表示含义一样,所以X或者*都是可以省略的。

  • "" (空字符串) := * := >=0.0.0
  • 1 := 1.x.x := >=1.0.0 <2.0.0
  • 1.2 := 1.2.x := >=1.2.0 <1.3.0

波浪线(~)范围 ~1.2.3 ~1.2 ~1

  • ~1.2.3 := >=1.2.3 <1.(2+1).0 := >=1.2.3 <1.3.0
  • ~1.2 := >=1.2.0 <1.(2+1).0 := >=1.2.0 <1.3.0 (类似于 1.2.x)
  • ~1 := >=1.0.0 <(1+1).0.0 := >=1.0.0 <2.0.0 (类似于 1.x)
  • ~0.2.3 := >=0.2.3 <0.(2+1).0 := >=0.2.3 <0.3.0
  • ~0.2 := >=0.2.0 <0.(2+1).0 := >=0.2.0 <0.3.0 (类似于 0.2.x)
  • ~0 := >=0.0.0 <(0+1).0.0 := >=0.0.0 <1.0.0 (类似于 0.x)
  • ~1.2.3-beta.2 := >=1.2.3-beta.2 <1.3.0 注意版本为1.2.3且大于等于beta.2的测试版本在范围内,因此 1.2.3-beta.4 满足条件,而1.2.4-beta.2不满足条件。

补注号(^)范围 ^1.2.3 ^0.2.5 ^0.0.4

允许在不修改[major, minor, patch]中最左非零数字的更改。换句话说,允许在 1.0.0 及以上版本对次版本号和修订版本号的更新,允许在 0.1.0以及以上版本对修订版本号更新,版本为 0.0.X 不允许更新。

  • ^1.2.3 := >=1.2.3 <2.0.0
  • ^0.2.3 := >=0.2.3 <0.3.0
  • ^0.0.3 := >=0.0.3 <0.0.4
  • ^1.2.3-beta.2 := >=1.2.3-beta.2 <2.0.0
  • ^0.0.3-beta := >=0.0.3-beta <0.0.4
  • ^1.2.x := >=1.2.0 <2.0.0
  • ^0.0.x := >=0.0.0 <0.1.0
  • ^0.0 := >=0.0.0 <0.1.0
  • ^1.x := >=1.0.0 <2.0.0
  • ^0.x := >=0.0.0 <1.0.0