c代码翻译为PHP时遇到的问题

最近由于想把下面这段c代码翻译为PHP的,未能成功:

unsigned long myhash(const char *s, long mod){
unsigned char ch;
unsigned int h = 5381;
int len = strlen(s);
while (
len > 0)    {
ch = *s++ - 'A';
if (
ch <= 'Z' - 'A'){
ch += 'a' - 'A';
}
h = ((h << 5) + h) ^ ch;
--
len;
}
return
h%mod;
}

遇到的问题是:

1. PHP 的整型总是有符号的
2. PHP 的整型在32位机上是32位的,在64位机上是64位的

期望能通过pack,unpack函数来实现,研究了半天,也没有实现。

还想搞清楚的问题:

一个负数 a 模上一个数 M, 和将a强制转换成无符号后模上相同的M,其结果之间是什么关系?
如:
-100 % 15  = -10;
((unsigned) (-100)) % 15 = 6

[root@login ~]# php -r "echo sprintf('%u',-100);"
4294967196

然后用bc算一下就知道了

关于gethostname系统调用

关于hostname的事情,我不知道是存放在系统的什么地方的,想知道时却发现是通过系统调用gethostname实现的,给系统调用在linux上只要包含<unistd.h>,就可以使用;
但是在windows上就没有在这个里面,windows上我没有使用visual studio,而是下载了一个dev-c++;因为对于命令行的东西比较熟悉一些,同样的程序在linux上是没问题的,但是在windows上就是编译不过去;
代码如下:
#include <unistd.h>
#include <iostream>

using namespace std;

int main(int ac, char ** av) {
    char name[256];
    size_t len = 256;
    gethostname(name, len);
    cout << name << endl;
    return 0;
}

在windows上需要添加:

#include <winsock2.h>

而在编译时也需要把libwsock32.a 带上,如:
g++ -L D:\Program\DEV-CPP\Lib  -o gethostname gethostname.cpp 
D:\Program\DEV-CPP\Lib\libwsock32.a

你可能会问,为什么已经使用了-L了libwsock32.a还要使用全路径,这个我也不知道,反正不给全路径就是找不到该文件。

虽然windows上也编译成功了,但是输出的结果却不是hostname命令所看到的,难道是这个libwsock32.a里面的gethostname的实现和hostname命令不太一样?通过denpendency woker这个小软件查了一下,使用的是同一个dll中的系统调用。 为什么结果不一样就不知道了,windows上的东西就是不好查。

apache 的AcceptMutex 的理解

当apache监听多个端口或多个ip上的端口时,多个子进程是怎么分工的呢?和只监听一个端口有什么区别吗?

1. 如果apache的多个进程只监听一个端口,则不需要AcceptMutex,每个apache进程都在执行accept操作,发现请求后就开始执行,执行完继续accept,多个进程之间不会相互干扰,这是由accept的机制来完成的。

2. 如果apache的多个进程只监听socket多于一个,则不能直接accept了,就必须使用select或poll机制来发现知否有请求需要执行,发现之后,再由accept来接受请求;然而select或poll没有accept那么能自动处理互斥的问题,这时候就需要一个“锁”了,就是所谓的AcceptMutex,AcceptMutex的实现形式有多种,这个不属于本文讨论的范围。
   下面是apache在监听三个socket(
[16 17 18])时,其中一个进程的表现:
semop(524288, 0x81dd334, 1)             = 0
select(19, [16 17 18], NULL, NULL, NULL) = 1 (in [17])
accept(17, {sa_family=AF_INET, sin_port=htons(52932), sin_addr=inet_addr("10.55.38.9")}, [16]) = 29
semop(524288, 0x81dd33a, 1)             = 0

第一步:先获取锁(0x81dd334), 同一时刻只有一个进程能获取锁
第二步:开始select(对于apache2这里好像是poll,poll的效率更高一些),并且发现17需要处理了
第三步:accept 17
第四步:释放锁,这样其它进程就可以获取锁并处理后续的请求了

配置ZendServer时遇到的问题及解决办法

关于ZendServer请访问官方网站: http://www.zend.com/en/

问题一: 安装后访问PHP文件总是“内部服务器错误”
解决办法:
查看apache的错误日志发现是文件ZendEnablerConf.xml解析失败,打开发现第一行乱码,修改就行了。

问题二: 重新配置了一下httpd.conf,添加了两个虚机;但是启动总是提示:
httpd.exe: Could not reliably determine the server’s fully qualified domain
解决办法:
在虚机外面添加一个ServerName就行了,写127.0.0.1就行;可以通过命令
httpd.exe   -t
检查出来的。
因为如果没有ServerName,则将通过 ap_get_local_host 来发现ServerName, 发现了的ServerName和 hostname命令看到的是一样的,但是发现后还要判断有效性和反解析的。如果ServerName中没有“.” 就不合法,如果反解析出来不正确也不行。
所以,这里要注意两个问题:
1. 要么在每一个虚机外面设置一个ServerName, 要么hostname设置要合法且有效
2. windows上的hostname里面是不能含有”.“的;
如:

$hostname
phpor.cn


hosts 文件如下就可以:

127.0.0.1       phpor.cn
127.0.0.1       localhost


hosts 文件如下就不可以:

127.0.0.1       phpor.cn
127.0.0.1       localhost


问题三: 这个是我一个手误,把虚机配错了,总是进入不到想要的虚机
解决办法:
我只想知道我的请求到底进入了哪个虚机,怎么办?可以在不同的虚机里面使用Header指令给响应头添加标识就行了,如:
Header set vhost phpor.net
这样查看响应头就知道是进入了哪个虚机了

rfc  摘录

关于cookie的几点研究

1. 关于父域和子域使用相同cookie的情况
  在 PHP(5)的源码中,main/php_variables.c 中有rfc2965的相关说明, 里面解释了的当在cookie串中遇到两个同名cookie时的处理策略

2. 至于浏览器如何处理接受到的cookie,遇到子域和父域下有同名cookie时处理策略还需要在查一些资料,在看…

 

12星座对照表

    

        

            

            

            

            

        

        

            

            

            

            

        

        

            

            

            

            

        

        

            

            

            

            

        

        

            

            

            

            

        

        

            

            

            

            

        

        

            

            

            

            

        

        

            

            

            

            

        

        

            

            

            

            

        

        

            

            

            

            

        

        

            

            

            

            

        

        

            

            

            

            

        

        

            

            

            

            

        

    

标志 星座名称 出生日期(阳历) 12星座性格
牡羊座标志 白羊座 03月21日─04月20日 积极、直率
金牛座标志 金牛座 04月21日─05月21日 可靠、有耐心
双子座标志 双子座 05月22日─06月21日 机智、适应力强
巨蟹座标志 巨蟹座 06月22日─07月23日 真挚、有包容力
狮子座标志 狮子座 07月24日─08月23日 热心、有领导能力
处女座标志 处女座 08月24日─09月23日 头脑清晰、完美主义
天秤座标志 天秤座 09月24日─10月23日 和谐、平易近人
天蝎座标志 天蝎座 10月24日─11月22日 果然、实际
射手座标志 射手座 11月23日─12月22日 活泼、思想开明
魔羯座标志 魔羯座 12月23日─01月22日 有原则、太现实
水瓶座标志 水瓶座 01月21日─02月19日 创意、智慧
双鱼座标志 双鱼座 02月20日─03月20日 浪漫、善解人意

官方飞信iphone版的设置

好久没关注weiphone论坛了,昨天才看到飞信终于出官方iphone客户端了。大喜,于是上iTunes下载安装。但是安装后却连接不上,总提示“链接导航服务器失败”。经查发现,官方飞信只能在cmwap模式下使用。

经验证,威锋论坛里zhcq163童鞋给出的解决方法很有效:

中国移动基于维护自己利益的考虑,限制官方飞信只能用cmwap接入才能登录,很多同学在apn填入cmwap不能登录,是因为你的cmwap没有破解,还不能使用。因此提供一种简单方法来破解cmwap,解决用不了官方飞信的问题。
1、首先将我提供的配置文件解压缩后作为附件发送到自己邮箱,我用的是gmail没问题,其他邮箱没有测试,应该也可以。
2、使用iphone自带的mail功能,配置好自己的邮箱信息,点击刚才所发邮件中的附件,iphone会提示安装描述文件,点安装就可以了。
3、在蜂窝数据-apn填入cmwap就ok,可以登录官方飞信了,别忘了关掉wifi。
10楼的兄弟美版32G未越狱用此方法已经成功。

提醒:
1、只有移动用户才可以,联通用户直接无视。
2、压缩文件一定要解压缩后发到自己邮箱,解压后的文件名为:CMWAP配置描述文件.mobileconfig
3、如果想使用cmnet上网,请将apn改回cmnet就可以了,经测试可行
4、如果感觉效果不好,进入设置——通用——cmwap配置文件,点击移走即可卸载。

点击这里下载:CMWAP配置描述文件

 

来源: http://shuai.be/archives/iphone-fetion-login/