十一 26

PHP http_build_query函数

http_build_query  生成 URL-encode 之后的请求字符串。

string http_build_query ( mixed $query_data [, string $numeric_prefix [, string $arg_separator [, int $enc_type = PHP_QUERY_RFC1738 ]]] )

query_data

可以是数组或包含属性的对象。

一个 query_data 数组可以是简单的一维结构,也可以是由数组组成的数组(其依次可以包含其它数组)。

如果 query_data 是一个对象,只有 public 的属性会加入结果。

范例

例一 http_build_query() 使用示例

以上例程会输出:

例二 http_build_query() 使用数字下标的元素

以上例程会输出:

例三 http_build_query() 使用复杂的数组

这会输出:(为了可读性,字已经换行了)

Note:

只有基础数组中的数字下标元素“CEO”才获取了前缀,其它数字下标元素(如 pastimes 下的元素)则不需要为了合法的变量名而加上前缀。

例四 http_build_query() 使用对象

以上例程会输出:

 

十一 20

PHP Curl实例

1、cURL请求的基本步骤:
(1)初始化

(2)设置选项,包括URL

(3)执行并获取HTML文档内容

(4)释放cURL句柄

注意:第二步最重要,也就是curl_setopt()函数 我们可以加一段检查错误的语句,这里要注意用的是”===false”,这是为了区分空输出和布尔值false

curl_getinfo()函数返回cURL执行后这一请求相关的信息,这对调试和排错很有用:

返回的数据

2、使用curl抓取图片

这些信息在调试很有用,例如在cURL抓取的时候,可能由于网络等原因,时常出现抓取数据不完整的情况,这是我们可以通过所获取的数据计算filesize,然后和curl_getinfo()获取的进行比较,如果大小相等,就认定下载正确,否则进行重复尝试。

下面我们看一个抓取图片的例子:

3、在cURL中用POST方法发送数据

用此方法可以模拟留言,或者可以坐灌水机器人,思路都是一样的

4、用cURL上传文件

注意:要发送文件时,要在文件名前面加上 @ 前缀并使用完整路径

5、使用代理进行抓取

为什么要使用代理进行抓取呢?以google为例吧,如果去抓google的数据,短时间内抓的很频繁的话,你就抓取不到了。google对你的ip地址做限制这个时候,你可以换代理重新抓。

6、抓取一些有页面访问控制的页面

以前写过一篇,页面访问控制的3种方法有兴趣的可以看一下。

如果用上面提到的方法抓的话,会报以下错误

You are not authorized to view this page
You do not have permission to view this directory or page using the credentials that you supplied because your Web browser is sending a WWW-Authenticate header field that the Web server is not configured to accept.

这个时候,我们就要用CURLOPT_USERPWD来进行验证了。

7、模拟登录到sina

我们要抓取数据,可能是登录以后的内容,这个时候我们就要用到curl的模拟登录功能了。

打开/tmp下面的cookie文件看一下

8、cURL设置项

其实,cURL有许多配置选项,这些选项才是cURL的灵魂,通过setopt()设置,下面总结几个比较常见且重要的配置项,希望在对读者在以后用到cURL时有一定的帮助:

CURLOPT_AUTOREFERER:当根据location:重定向时,自动设置header中的Referer:信息

CURLOPT_COOKIESESSION:启用时cURL会紧紧传递一个sessioncookie,忽略其他cookie

CURLOPT_HEADER:将头文件的信息作为数据流输出

CURLOPT_INFILESIZE:设置上传文件的大小,单位为字节

CURLOPT_MAXCONNECTS:允许最大连接数量

CURLOPT_MAXREDIRS:指定HTTP重定向的最多数量

CURLOPT_COOKIE:设置HTTP请求中“cookie:”部分的内容,多个cookie用分号跟个,分号后带一个空格

CURLOPT_POSTFIELDS:全部数据用HTTP协议中的“POST”操作发送要发送文件,在文件名前面加上@前缀并使用完整路径

十一 19

PHP汉字字符串替换、转换(str_replace、strtr)

str_replace

替换字符串、替换汉字,字母区分大小写

在上一例中, $a,$b,$c都可以是数组或字符串,或三个变量中又有字符串又有数组

$i是可选的,返回替换次数。


 str_replace小结:

$a,$b,$c全部为字符串时好理解,就不说了。$a,$b,$c全部或分别为数组的时候,在某些条件下是很有用处的。

1、当$a,$b都为数组时,即是使用$b[0]替换所有$a[0]的字符,使用$b[1]替换所有$a[1]的字符……也就是说是使用$b数组的对应键的值替换$a数组中的对应键的值;如果$b成员个数小于$a的成员个数时,用空代替。

2、$a可以为数组可以为字符串,但是当$a为字符串时,$b必须为字符串

3、每次替换都是替换新最新的对象($c),看“例九”,先用“a1”在$c中进行查找替换,再用“先生”在$c中进行查找替换,此时$c=’s c1s 织梦sa’,现在使用$a中最后一个成员“织梦s”对$c字符串进查找替换。

strtr

字符转换

 strtr小结:

1、例十三说明,每次转换都是对原始字符串进行转换的,并不是对新字符串转换。

2、在$b和$c全为字符串时,是使用$c的第1位替换$b的第1位字符,使用$c的第2位替换$b的第2位字符……对应位没有字符,则不做转换处理。

总结:

函数str_replace与函数strtr各有个的使用场景,多做一些实例的测试感觉挺有意思的,也使我们能更深入的了解并理解它的更多功能,把这些积累的经验运用到开发过程中,解决一些实际问题,达到节省开发时间或脚本运行的更优化。

如果发现我的问题或者有疑问,请指出或者一起探讨学习。织梦先生QQ1234567

 

十一 07

Linux命令chmod:修改文件或文件夹权限

在Linux中要修改一个文件夹或文件的权限我们需要用到linux chmod命令来做,下面我写了几个简单的实例大家可参考一下。

语法如下:

chmod [who] [+ | - | =] [mode] 文件名

命令中各选项的含义为

u 表示“用户(user)”,即文件或目录的所有者。
g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
o 表示“其他(others)用户”。
a 表示“所有(all)用户”。它是系统默认值。

操作符号可以是:

+ 添加某个权限。
– 取消某个权限。
= 赋予给定权限并取消其他所有权限(如果有的话)。

设置mode所表示的权限可用下述字母的任意组合:

r 可读。
w 可写。
x 可执行。

X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。

s 在文件执行时把进程的属主或组ID置为该文件的文件属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。
t 保存程序的文本到交换设备上。
u 与文件属主拥有一样的权限。
g 与和文件属主同组的用户拥有一样的权限。
o 与其他用户拥有一样的权限。

实例

修改文件可读写属性的方法

例如:把index.html 文件修改为可写可读可执行:

chmod 777 index.html

要修改目录下所有文件属性可写可读可执行:

chmod 777 *.*

把文件夹名称与后缀名用*来代替就可以了。
比如:修改所有htm文件的属性:

chmod 777 *.htm

修改文件夹属性的方法
把目录 /images/xiao 修改为可写可读可执行

chmod 777 /images/xiao

修改目录下所有的文件夹属性

chmod 777 *

把文件夹名称用*来代替就可以了

要修改文件夹内所有的文件和文件夹及子文件夹属性为可写可读可执行

chmod -R 777 /upload

总结linux下目录和文件的权限区别

文件:读文件内容(r)、写数据到文件(w)、作为命令执行文件(x)。

目录:读包含在目录中的文件名称(r)、写信息到目录中去(增加和删除索引点的连结)、搜索目录(能用该目录名称作为路径名去访问它所包含的文件和子目录)

具体说就是:

(1)有只读权限的用户不能用cd进入该目录:还必须有执行权限才能进入。
(2)有执行权限的用户只有在知道文件名,并拥有读权利的情况下才可以访问目录下的文件。
(3)必须有读和执行权限才可以ls列出目录清单,或使用cd命令进入目录。
(4)有目录的写权限,可以创建、删除或修改目录下的任何文件或子目录,即使使该文件或子目录属于其他用户也是如此。

查看目录权限

查看文件权限的语句:

在终端输入:

ls -l xxx.xxx (xxx.xxx是文件名)

那么就会出现相类似的信息,主要都是这些:

-rw-rw-r–

一共有10位数

其中: 最前面那个 – 代表的是类型
中间那三个 rw- 代表的是所有者(user)
然后那三个 rw- 代表的是组群(group)
最后那三个 r– 代表的是其他人(other)

然后我再解释一下后面那9位字符:

r 表示文件可以被读(read)
w 表示文件可以被写(write)
x 表示文件可以被执行(如果它是程序的话)
- 表示相应的权限还没有被授予

现在该说说修改文件权限了

在终端输入:

chmod o w xxx.xxx

表示给其他人授予写xxx.xxx这个文件的权限

chmod go-rw xxx.xxx

表示删除xxx.xxx中组群和其他人的读和写的权限

其中:

u 代表所有者(user)
g 代表所有者所在的组群(group)
o 代表其他人,但不是u和g (other)
a 代表全部的人,也就是包括u,g和o
r 表示文件可以被读(read)
w 表示文件可以被写(write)
x 表示文件可以被执行(如果它是程序的话)

其中:rwx也可以用数字来代替
r ————4
w ———–2
x ————1
- ————0
行动:

表示添加权限
- 表示删除权限
= 表示使之成为唯一的权限

当大家都明白了上面的东西之后,那么我们常见的以下的一些权限就很容易都明白了:

-rw——- (600) 只有所有者才有读和写的权限
-rw-r–r– (644) 只有所有者才有读和写的权限,组群和其他人只有读的权限
-rwx—— (700) 只有所有者才有读,写,执行的权限
-rwxr-xr-x (755) 只有所有者才有读,写,执行的权限,组群和其他人只有读和执行的权限
-rwx–x–x (711) 只有所有者才有读,写,执行的权限,组群和其他人只有执行的权限
-rw-rw-rw- (666) 每个人都有读写的权限
-rwxrwxrwx (777) 每个人都有读写和执行的权限

十一 07

linux命令wget:wget使用方法

Wget是一个十分常用命令行下载工 具,Wget使用格式如下:
#wget [选项] [下载地址]
Wget常用参数
-b:后台下载,Wget默认的是把文件下载到当前目录。
-O:将文件下载到指定的目录中。
-P:指定保存文件的目录。
-N:don’t re-retrieve files unless newer than
-t:尝试连接次数,当Wget无法与服务器建立连接时,尝试连接多少次。
-c:断点续传,如果下载中断,那么连接恢复时会从上次断点开始下载。
此外,Wget还可下载整个 网站,如下载http://man.chinaunix.net整个Man手册中心。
只需输入如下命令即可: #wget -r -p -np -k http://man.chinaunix.net 其中-r参数是指使用递归下载,
-p是指下载所有显示完整网页所以需要的文件,如图片等,-np是指不搜索上层目录,-k则 是指将绝对链接转换为相对链接。
Continue reading

十一 06

Liunx重启与关机命令

重启命令:
1、reboot
2、shutdown -r now 立刻重启(root用户使用)
3、shutdown -r 10 过10分钟自动重启(root用户使用)
4、shutdown -r 20:35 在时间为20:35时候重启(root用户使用)
如果是通过shutdown命令设置重启的话,可以用shutdown -c命令取消重启

关机命令:
1、halt   立刻关机(root用户使用)
2、poweroff  立刻关机
3、shutdown -h now 立刻关机(root用户使用)
4、shutdown -h 10 10分钟后自动关机
如果是通过shutdown命令设置关机的话,可以用shutdown -c命令取消重启

13

PHP网站(windows2003服务器 IIS6)提示:系统找不到指定的路径。

今天早上起来一看其它某php网站(下称:A站),直接就提示:“系统找不到指定的路径。”,其它的什么也没有。输入网站的各种网址都是这样。

回想一下近期的操作,由于服务器的PHP版本太低,自己下载了下个phpStudy(phpStudy4IIS版),作了一下PHP版本的升级,升级很成功,秒完成。重启IIS6,检查了一下本站,显示正常,但是没有看其它网站,所以现在也不确定当时是否正常。

在A站根目录建了一个PHP文件,内容为“<?php phpinfo(); ”,查看下php是否正常,结果不显示。所以断定是PHP程序配置问题。

系统找不到指定的路径。

IIS6不像IIS7等高级版本那么直观,查看IIS6,IIS6>>右键点A站>>属性>>主目录>>配置>>映射>>应用程序扩展。

系统找不到指定的路径。

 

系统找不到指定的路径。

查找扩展名为“.php”项的“可执行文件路径”,是否是升级后的PHP执行文件,结果我的不是,还是原来的路径。问题找到了。

解决方案:

不管你服务器中的网站是一个还是多个,都要使用继承的方法去修改,防止有不必要的麻烦。

IIS6>>右键点网站(这是统一配置,看下图,其它步骤看上面图片)>>属性>>主目录>>配置>>映射>>应用程序扩展

QQ20160713141152

 

如果也是像我使用phpStudy升级过PHP的,路径为“phpStudy4IIS\IIS\fcgiext.dll”,注意:在此路径前加入你的绝对路径。

修改路径后“确定”,选择“全选”(使用以下的所有网站都继承此配置),确定,确定…….

重启IIS6

完成。

如果有其它情况出现,那自己再好好检查一下吧。或者加我QQ,有时间的话我帮你弄弄也可以。

02

MySql获取INSERT后的自增ID、MySql设置变量

表结构:

table_a表中aid为自增长字段

要求使用在插入表table_a后的自增字段aid值做为表table_b的mid字段值,并且用这个值连接固定字符串“abc”后做为字段name2的值,完全使用MySql语言。

设置变量@len

max(aid) 获取mysql在插入一条数据后的自增ID值

CONCAT(‘abc’, @num) 按照参数的顺序拼接成一个字符串做为返回值

知识点:

mysql中变量不用事前申明,在用的时候直接用“@变量名”使用就可以了。

第一种用法:set @num=1; 或set @num:=1; //这里要使用变量来保存数据,直接使用@num变量

第二种用法:select @num:=1; 或 select @num:=字段名 from 表名 where ……

注意上面两种赋值符号,使用set时可以用“=”或“:=”,但是使用select时必须用“:=赋值”

 

05

PHP获得真实客户端的真实IP REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR

REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP。如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP。
HTTP_CLIENT_IP 是代理服务器发送的HTTP头。如果是“超级匿名代理”,则返回none值。同样,REMOTE_ADDR也会被替换为这个代理服务器的IP。
$_SERVER['REMOTE_ADDR']; //访问端(有可能是用户,有可能是代理的)IP
$_SERVER['HTTP_CLIENT_IP']; //代理端的(有可能存在,可伪造)
$_SERVER['HTTP_X_FORWARDED_FOR']; //用户是在哪个IP使用的代理(有可能存在,也可以伪造)

三个值区别如下:

一、没有使用代理服务器的情况:

REMOTE_ADDR = 您的 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示

二、使用透明代理服务器的情况:Transparent Proxies

REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。

三、使用普通匿名代理服务器的情况:Anonymous Proxies

REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。

四、使用欺骗性代理服务器的情况:Distorting Proxies

REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 随机的 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。

五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)

REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。

上面内容是抄袭的,下面代码是个人测试可以获取到客户端真实IP的方法。

 

23

PHP各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)

普通hash函数如md5、sha1、base64等都是不可逆函数。虽然我们利用php可以利用这些函数写出可逆函数来。但是跨语言时这类可逆函数非常难搞定。所以这时尽量使用AES DES RC4 Rabbit TripleDes这些方法。

包含超时的加密解密函数

最简单的往往是最好用的。

URL加密解密函数

用户密码可逆加密解密函数:

测试方法:

SHA1的可逆加密解密函数:

DES的加密解密函数:

封装了两个PHP对称加密解密函数