工欲善其器 必先利其器–mac os x

购买rbmp也有一段时间了,一直没怎么用 ,最近向公司请了几天假,正好有点闲余时间,那么就好好的折腾一下mac os x 把。

环境:mac os x 10.8.3

1 编译工具

mac默认是没有gcc make等编译工具的 

xcode挤集成了这些工具包:

打开xcode  点击顶部的导航栏xcode->preference

在弹出的面板中Downloads 下面的components下有个Command Line Tools 点击安装即可

安装完之后就可以在terminal里用gcc了

2 Git

第一步安装了Command Line Tools之后 os x 自动给你安装了git 不过该git版本比较低(git  –version)

由于本人有强烈的升级控欲望 遂安装了最新版 可以命令

brew install git 

3 Brew

一个软件包管理工具 类似ubuntu下的apt-get  fedora下的yum

安装方法超级简单

http://mxcl.github.io/homebrew/index_zh-cn.html

 

5 iTerm2

替代自带terminal的不二选择

macvim        

ssh

[非]交互式[非]登陆shell

问题:切换到root之后 alias不起效果

登陆shell和非登陆shell

登录shell:

  • 用户登陆时,输入用户名和密码后启动的shell;
  • 通过带–login参数的命令:bash –login而启动的shell。对于用户来说,登陆shell和非登陆shell的主要区别是:启动shell时所执行的startup文件不同。我在/etc/profile、~/.bash_profile、~/.bashrc三个文件中分别通过echo命令打印出文件名。

非登录shell:
当然就不需要输入用户名和密码即可打开的Shell,例如:直接命令“bash”就是打开一个新的非登录shell,在Gnome或KDE中打开一个“终端”(terminal)窗口程序也是一个非登录shell。

Mac OS X的终端窗口是个例外。每个终端窗口在打开的时候都会执行登录shell即.bash_profile代替了.bashrc

执行exit命令,退出一个shell(登录或非登录shell)。

执行logout命令,退出登录shell(不能退出非登录shell)。

对于Bash来说,登录shell(包括交互式登录shell和使用“–login”选项的非交互shell),它会首先读取和执行/etc/profile全局配置文件中的命令,然后依次查找~/.bash_profile、~/.bash_login 和 ~/.profile这三个配置文件,读取和执行这三个中的第一个存在且可读的文件中命令。除非被“–noprofile”选项禁止了。

而bash作为非登陆shell启动时读取~/.bashrc。注意,作为登陆shell时bash并不读取~/.bashrc,但是在文件~/.bash_profile中通常都有如下语句来读取~/.bashrc:

if [ –f ~/.bashrc ]; then . ~/.bashrc; fi

交互式shell和非交互式shell(interactive shell and non-interactive shell)

交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。

shell也可以运行在另外一种模式:非交互式模式,以shell script(非交互)方式执行。在这种模式 下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾EOF,shell也就终止了。 可以通过打印“$-”变量的值(代表着当前shell的选项标志),查看其中的“i”选项(表示interactive shell)来区分交互式与非交互式shell。

mbp:~ haidx$ ./test.sh hB
mbp:~ haidx$ echo $- himBH

bash与sh

centos6.2

[root@xnxy ~]# ll `which sh`
lrwxrwxrwx 1 root root 4 Apr 8 13:18 /bin/sh -> bash

可以这样理解, “sh”并不是一个程序,而是一种标准(POSIX), 这种标准,在一定程度上保证了脚本的跨系统性(跨UNIX系统)

调用相关:
在脚本的调用方面(interactive、login相关),bash与sh也是存在差异 以下是详细说明(假如被调用执行的脚本名字叫xxx.sh)
BASH:

1、 交互式的登录shell (bash –il xxx.sh)
载入的信息:
/etc/profile
~/.bash_profile( -> ~/.bashrc -> /etc/bashrc)
~/.bash_login
~/.profile

2、非交互式的登录shell (bash –l xxx.sh)
载入的信息:
/etc/profile
~/.bash_profile ( -> ~/.bashrc -> /etc/bashrc)
~/.bash_login
~/.profile
$BASH_ENV

3、交互式的非登录shell (bash –i xxx.sh)
载入的信息:
~/.bashrc ( -> /etc/bashrc)

4、非交互式的非登录shell (bash xxx.sh)
载入的信息:
$BASH_ENV

SH:

1、交互式的登录shell
载入的信息:
/etc/profile
~/.profile

2、非交互式的登录shell
载入的信息:
/etc/profile
~/.profile

3、交互式的非登录shell
载入的信息:
$ENV

4、非交互式的非登录shell
载入的信息:
nothing

参考文献

chsh -s /bin/bash

mac osx 卸载mysql

蛋疼 – - 还是源代码编译安装mysql好点 搞什么dmg安装 唉 mysql真坑人  安装了之后还没有卸载工具

只好手动rm 之

先开启下root

官方文档:http://support.apple.com/kb/HT1528?viewlocale=zh_CN&locale=zh_CN

这个看不懂的话看这个。。其实官方文档我也没看懂- -

http://www.macx.cn/thread-2051799-1-1.html

好把 接下来rm mysql

sudo rm /usr/local/mysql
sudo rm -rf /usr/local/mysql*
sudo rm -rf /Library/StartupItems/MySQLCOM
sudo rm -rf /Library/PreferencePanes/My*
vim /etc/hostconfig and removed the line MYSQLCOM=-YES-
rm -rf ~/Library/PreferencePanes/My*
sudo rm -rf /Library/Receipts/mysql*
sudo rm -rf /Library/Receipts/MySQL*
sudo rm -rf /var/db/receipts/com.mysql.*

Missing argument 2 for wpdb::prepare()

wordpress升级到3.5突然出现这个问题 去footer.php查看
$post_datetimes = $wpdb->get_row($wpdb->prepare(“SELECT YEAR(min(post_date_gmt)) AS firstyear, YEAR(max(post_date_gmt)) AS lastyear FROM $wpdb->posts WHERE post_date_gmt > 1970″));
预处理丢失了一个参数
改为这样既可
$post_datetimes = $wpdb->get_row($wpdb->prepare(“SELECT YEAR(min(post_date_gmt)) AS firstyear, YEAR(max(post_date_gmt)) AS lastyear FROM $wpdb->posts WHERE post_date_gmt > %d”,’1970′));
和C语言差不多 动态绑定参数

再给个普遍点的例子,这样写法是正确的:

$wpdb->prepare( “SELECT * FROM table WHERE id = %d”, $id );

win+apache+php5.3.x+fastcgi+zend guard loader

背景:
win7+apache2.4 vc9 + php5.3.20 nts vc9 + LoadModule fcgid_module modules/mod_fcgid.so +zend gurad loader3.3
note:php5.3与zend解密组合 只能是php nts 版的 5.3版本的php包里没有php5apache2_x.dll 即不能用apache2handler方式 所以选择fastcgi

配置:
在apache的httpd.conf最下面添加如下

不能启动的问题:

1 注意如果你以前指定了PHPIniDir的位置 一定要注释掉!!!!!
2 如果出现了诡异的html无法解析 那么很有可能是缺少
DefaultType text/plain
解释:
有时会发生这样的事:服务器会被要求提供一个文档,而这个文档的类型无法由它的MIME类型映射所决定。
服务器必须通知客户端其文档的内容类型。所以当一个未知类型出现时,将会使用DefaultType 。

或者你也可以用AddType text/html .html 来指定 这句话就是指将html后缀的文件当做text/html

附加zend:
在php.ini中附加
[Zend]
zend_extension=”E:/web/php5.3.20ts/extras/ZendLoader.dll”
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3

参考资料:

http://fuzzytolerance.info/blog/apache-mod_fcgid-and-php-on-windows/

SAPI CLI CGI 名称解释

SAPI ==Server Application Programming Interface  即服务端应用编程端口
note: sapi不是isapi isapi只是sapi的一种 是微软提供的

CLI和 CGI 是不同的 SAPI。

在 PHP 4.2.0 到 PHP 4.2.3 之间的 Windows 发行包中,CLI 的文件名为 php-cli.exe,相同文件夹下的 php.exe 为 CGI。从 PHP 4.3.0 版本开始,Windows 的发行包中 CLI 的执行文件为 php.exe,被放置在一个单独的名为 cli 的文件夹下,即 cli/php.exe。在 PHP 5 中,CLI 存在于主文件夹中,名为 php.exe,而 CGI 版本名为 php-cgi.exe

从 PHP 5 起,一个名为 php-win.exe的新文件随包发布。它相当于 CLI 版本,但是 php-win 不输出任何内容,便不提供控制台(不会弹出“DOS 窗口”)。这种方式类似于 php-gtk。需要使用 –enable-cli-win32选项来配置它。

Note: 如何得知自己使用的是哪个 SAPI?

在命令行下,运行 php -v 便能得知该 php 是 CGI 还是 CLI。请参考函数 php_sapi_name() 以及常量 PHP_SAPI

string php_sapi_name ( void )

Returns a lowercase string that describes the type of interface (the Server API, SAPI) that PHP is using. For example, in CLI PHP this string will be “cli” whereas with Apache it may have several different values depending on the exact SAPI used. Possible values are listed below.

Returns the interface type, as a lowercase string.

Although not exhaustive, the possible return values include aolserverapacheapache2filterapache2handlercaudiumcgi (until PHP 5.3), cgi-fcgiclicontinuityembedisapilitespeedmilternsapiphttpdpi3webroxenthttpdtux, and webjames.

以上是引用的官方文档  从这里我们可以看出 cgi apache2handler fasctcgi isapi 都只是一种sapi而已!!!

区别我们在上一篇文章可以看到

php cgi fast-cgi cli isapi apache模式

php一共分为五大运行模式:包括cgi 、fast-cgi、cli、isapi、apache 模块的 DLL

CGI
CGI即通用网关接口(Common Gateway Interface),它是一段程序,通俗的讲CGI就象是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执 行程序,再把服务器执行程序的结果返还给HTML页。CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。
CGI方式在遇到连接请求(用户 请求)先要创建cgi的子进程,激活一个CGI进程,然后处理请求,处理完后结束这个子进程。这就是fork-and-execute模式。所以用cgi 方式的服务器有多少连接请求就会有多少cgi子进程,子进程反复加载是cgi性能低下的主要原因。都会当用户请求数量非常多时,会大量挤占系统的资源如内 存,CPU时间等,造成效能低下。

CGI-FCGI
fast-cgi 是cgi的升级版本,FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager),全称PHP FastCGI进程管理器进行管理。
继续阅读

php各种运行模式

人都搞晕了 总结一下:
php用很多运行模式 基本上我们在win下开发中常用的都是把php当做apache一个模块 通过LoadModule php5_module “E:/path/php5apache2_x.dll 来生效

这就是典型的模式了

APACHE2HANDLER
PHP作为Apache模块,Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦有请求出 现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。这些服务器副本在处理完一次HTTP请求之后并不立即退出,而是停留在计 算机中等待下次请求。对于客户浏览器的请求反应更快,性能较高。
apache模块的DLL:
该运行模式是我们以前在windows环境下使用apache服务器经常使用的,而在模块化(DLL)中,PHP是与Web服务器一起启动并运行的。(是apache在CGI的基础上进行的一种扩展,加快PHP的运行效率)
isapi  apachle module (loadmodule  xxxx.dll)都是多线程
fastcgi 是多进程
nts版本的php适合fastcgi
ts版本的php适合isapi or Apache  2.x  Handler

参考资料:我就不复杂粘贴了

wamp缺少Zend Optimizer(Zend Guard Loader)的解决办法

在网上down了一套源码  发现经过zend加密  缺少Zend Optimizer 奈何wamp集成包根本没有这个组件   几经摸索  终于解决php5.3.x缺少Zend Optimizer  的问题  特此记录下来 。

1版本问题

php5.3.x 不能用zend optimizer  取而代之的是zend guard loader

Product Version Format/Size Notes
Zend Guard 5.5.0 (EXE) 59.88 MB Release Notes
Zend Optimizer (Runtime for PHP 5.2 and earlier) 3.3.3 (ZIP) 0.33 MB Release Notes
Zend Guard Loader (Runtime for PHP 5.3) 5.5.0 (ZIP) 0.07 MB Release Notes

PHP5.3.x版本如果想使用Zend Guard Loader,必须下载NTS的版本,而且必须是VC9编译的。这两点一定要注意,有一个不对都没法用Zend Guard Loader。

悲剧的是我发现wamp所带的php基本上是ts版本的(这个在phpinfo中可以看到)。。

 

1 no_ssl 与openssl

在apache官网上 我们发现windows版本有两种类型 分别是no_ssl和openssl

openssl多了个ssl安全认证模式,它的协议是HTTPS而不是HTTP,这就是带有SSL的服务器与一般网页服务器的区别了。一般情况下,我们下载no_ssl版本的就ok了。

2