php 自设公式计算思路


背景简介:
1.由公式去计算一些数字,如工资计算
2.方便后期维护,易修改公式

鉴于上述两点,在程序中写死公式就显得不妥,于是有了下面的思路,使用字符串型的公式进行计算:
1.可以设置一些科目,如科目1、科目2
2.由1中设置的科目来编写公式(通过加减乘除以及任何php可以识别的数学方法),简单例子如可以设置为 "[科目1]+[科目2]"
3.计算时通过str_replace方法将科目变为程序中的变量
4.最终就生成了程序可以使用的公式如$p1+$p2
5.计算,使用eval方法 $result = eval("return $p1+$p2;");

其他说明:
仅用加减乘除会无法实现一些公式计算,如计算个人所得税不同基数公式不同,那么可以使用形如 "[税前工资]>3500?(xxx计算公式):0"这样的公式来进行计算。
某些环境会禁用eval,那么就需要开放。

缺点:
公式错误程序会报错,可编写方法验证公式语法的正确性。


ftp_connect方法无法连接FTP服务器的解决办法


最近做了个关于PHP连接FTP服务器的小功能,发现一些FTP服务器用客户端可以连接但是PHP程序却无法连接。再排出网络问题外,最后得出结论如下:

首先介绍一下连接FTP服务器的两种工作模式:

主动模式的ftp是这样的;客户端从一个任意的非特权端口连接到ftp服务器的命令端口(21),然后客户端开始监听端口,并发送ftp命令到ftp服务器。服务器从它自己的数据端口20连接到客户端指定的数据端口。
被动模式ftp中,命令连接和数据连接都由客户端,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口,并发送PORT P命令给客户端。然后客户端发起从本地端口到服务器的端口的连接用来传送数据。

这些ftp服务器并非直接建立在公网,而是建设在内网通过端口映射的方式可使公网访问。也就是说必须采用主动模式访问,因为服务端仅有21端口映射到了公网。而php_connect默认为被动模式,所以调用ftp_pasv方法即可,具体如下:

$conn = ftp_connect("ftp.testftp.com") or die("Could not connect");
ftp_login($conn,"admin","ert456");
ftp_pasv($conn,FALSE);
ftp_close($conn);

雅虎天气api及使用方法


新的雅虎天气可以在https://developer.yahoo.com/weather/查询各类接口
在YQL Query中的text后的地名改为自己需要的地名,例如Xi'an,CN
然后选择结果是JSON或XML,例如这里选择XML
最终就在Endpoint里得到一个接口url
https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22xi%27an%2Ccn%22)&format=xml&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys
然后就可以得到想要的天气了,当然其中也有日落时间,等等。
后期我们只需要更改这个url中的地名就可以了。

以下内容已过期
首先来说说雅虎天气api的url是
http://weather.yahooapis.com/forecastrss?w=2151330&u=c
其中2141330是地区代码,u=c代表摄氏度(国内也很少会用华氏u=f)
那么我们只需要换地区代码就可以了
如何找到对应城市的地区代码呢
访问
正上面输入自己想要的地区名字,例如“Xi'an”,点击Search Weather
浏览器会跳转到https://weather.yahoo.com/china/shaanxi/xian-2157249/。下方内容为西安的天气。而链接中的2157249则是地区代码
我们替换api url中的地区代码
http://weather.yahooapis.com/forecastrss?w=2157249&u=c
就可以得到想要的天气了,当然其中也有日落时间,等等。
题外话:iphone上也用的是雅虎的天气。