php curl详解用法

目前为目最全的CURL中文说明了,学PHP的要好好掌握.有很多的参数.大部份都很有用.真正掌握了它和正

则,一定就是个采集高手了.

PHP中的CURL函数库(Client URL Library Function)

curl_close – 关闭一个curl会话
curl_copy_handle – 拷贝一个curl连接资源的所有内容和参数
curl_errno – 返回一个包含当前会话错误信息的数字编号
curl_error – 返回一个包含当前会话错误信息的字符串
curl_exec – 执行一个curl会话
curl_getinfo – 获取一个curl连接资源句柄的信息
curl_init – 初始化一个curl会话
curl_multi_add_handle – 向curl批处理会话中添加单独的curl句柄资源
curl_multi_close – 关闭一个批处理句柄资源
curl_multi_exec – 解析一个curl批处理句柄
curl_multi_getcontent – 返回获取的输出的文本流
curl_multi_info_read – 获取当前解析的curl的相关传输信息
curl_multi_init – 初始化一个curl批处理句柄资源
curl_multi_remove_handle – 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select – Get all the sockets associated with the cURL extension, which can then

be "selected"
curl_setopt_array – 以数组的形式为一个curl设置会话参数
curl_setopt – 为一个curl设置会话参数
curl_version – 获取curl相关的版本信息

curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url

地址。
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。

<?php
$ch = curl_init("http://www.baidu.com/");
curl_exec($ch);
curl_close($ch);
?>

curl_version()函数的作用是获取curl相关的版本信息,curl_version()函数有一个参数,不清楚是做什

么的

可设置的参数有:

CURLOPT_AUTOREFERER
自动设置header中的referer信息

CURLOPT_BINARYTRANSFER
在启用CURLOPT_RETURNTRANSFER时候将获取数据返回

CURLOPT_COOKIESESSION
启用时curl会仅仅传递一个session cookie,忽略其他的cookie,默认状况下curl会将所有的cookie返回

给服务端。session cookie是指那些用来判断服务器端的session是否有效而存在的cookie。

CURLOPT_CRLF
启用时将Unix的换行符转换成回车换行符。

CURLOPT_DNS_USE_GLOBAL_CACHE
启用时会启用一个全局的DNS缓存,此项为线程安全的,并且默认为true。

CURLOPT_FAILONERROR
显示HTTP状态码,默认行为是忽略编号小于等于400的HTTP信息

CURLOPT_FILETIME
启用时会尝试修改远程文档中的信息。结果信息会通过curl_getinfo()函数的CURLINFO_FILETIME选项返

回。

CURLOPT_FOLLOWLOCATION
启用时会将服务器服务器返回的"Location:"放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS

可以限定递归返回的数量。

CURLOPT_FORBID_REUSE
在完成交互以后强迫断开连接,不能重用。

CURLOPT_FRESH_CONNECT
强制获取一个新的连接,替代缓存中的连接。

CURLOPT_FTP_USE_EPRT
TRUE to use EPRT (and LPRT) when doing active FTP downloads. Use FALSE to disable EPRT and

LPRT and use PORT only.
Added in PHP 5.0.0.

CURLOPT_FTP_USE_EPSV
TRUE to first try an EPSV command for FTP transfers before reverting back to PASV. Set to

FALSE to disable EPSV.

CURLOPT_FTPAPPEND
TRUE to append to the remote file instead of overwriting it.

CURLOPT_FTPASCII
An alias of CURLOPT_TRANSFERTEXT. Use that instead.

CURLOPT_FTPLISTONLY
TRUE to only list the names of an FTP directory.

CURLOPT_HEADER
启用时会将头文件的信息作为数据流输出。

CURLOPT_HTTPGET
启用时会设置HTTP的method为GET,因为GET是默认是,所以只在被修改的情况下使用。

CURLOPT_HTTPPROXYTUNNEL
启用时会通过HTTP代理来传输。

CURLOPT_MUTE
讲curl函数中所有修改过的参数恢复默认值。

CURLOPT_NETRC
在连接建立以后,访问~/.netrc文件获取用户名和密码信息连接远程站点。

CURLOPT_NOBODY
启用时将不对HTML中的body部分进行输出。

CURLOPT_NOPROGRESS
启用时关闭curl传输的进度条,此项的默认设置为true

CURLOPT_NOSIGNAL
启用时忽略所有的curl传递给php进行的信号。在SAPI多线程传输时此项被默认打开。

CURLOPT_POST
启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一

样。

CURLOPT_PUT
启用时允许HTTP发送文件,必须同时设置CURLOPT_INFILE和CURLOPT_INFILESIZE

CURLOPT_RETURNTRANSFER
讲curl_exec()获取的信息以文件流的形式返回,而不是直接输出。

CURLOPT_SSL_VERIFYPEER
FALSE to stop cURL from verifying the peer's certificate. Alternate certificates to verify

against can be specified with the CURLOPT_CAINFO option or a certificate directory can be

specified with the CURLOPT_CAPATH option. CURLOPT_SSL_VERIFYHOST may also need to be TRUE or

FALSE if CURLOPT_SSL_VERIFYPEER is disabled (it defaults to 2). TRUE by default as of cURL

7.10. Default bundle installed as of cURL 7.10.

CURLOPT_TRANSFERTEXT
TRUE to use ASCII mode for FTP transfers. For LDAP, it retrieves data in plain text instead

of HTML. On Windows systems, it will not set STDOUT to binary mode.

CURLOPT_UNRESTRICTED_AUTH
在使用CURLOPT_FOLLOWLOCATION产生的header中的多个locations中持续追加用户名和密码信息,即使域

名已发生改变。

CURLOPT_UPLOAD
启用时允许文件传输

CURLOPT_VERBOSE
启用时会汇报所有的信息,存放在STDERR或指定的CURLOPT_STDERR中

CURLOPT_BUFFERSIZE
每次获取的数据中读入缓存的大小,这个值每次都会被填满。

CURLOPT_CLOSEPOLICY
不是CURLCLOSEPOLICY_LEAST_RECENTLY_USED就是CURLCLOSEPOLICY_OLDEST,还存在另外三个,但是curl

暂时还不支持。.

CURLOPT_CONNECTTIMEOUT
在发起连接前等待的时间,如果设置为0,则不等待。

CURLOPT_DNS_CACHE_TIMEOUT
设置在内存中保存DNS信息的时间,默认为120秒。

CURLOPT_FTPSSLAUTH
The FTP authentication method (when is activated): CURLFTPAUTH_SSL (try SSL first),

CURLFTPAUTH_TLS (try TLS first), or CURLFTPAUTH_DEFAULT (let cURL decide).

CURLOPT_HTTP_VERSION
设置curl使用的HTTP协议,CURL_HTTP_VERSION_NONE(让curl自己判断),CURL_HTTP_VERSION_1_0

(HTTP/1.0),CURL_HTTP_VERSION_1_1(HTTP/1.1)

CURLOPT_HTTPAUTH
使用的HTTP验证方法,可选的值有:CURLAUTH_BASIC,CURLAUTH_DIGEST,CURLAUTH_GSSNEGOTIATE,

CURLAUTH_NTLM,CURLAUTH_ANY,CURLAUTH_ANYSAFE,可以使用"|"操作符分隔多个值,curl让服务器选择

一个支持最好的值,CURLAUTH_ANY等价于CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE

| CURLAUTH_NTLM,CURLAUTH_ANYSAFE等价于CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE |

CURLAUTH_NTLM

CURLOPT_INFILESIZE
设定上传文件的大小

CURLOPT_LOW_SPEED_LIMIT
当传输速度小于CURLOPT_LOW_SPEED_LIMIT时,PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取

消传输。

CURLOPT_LOW_SPEED_TIME
The number of seconds the transfer should be below CURLOPT_LOW_SPEED_LIMIT for PHP to

consider the transfer too slow and abort.
当传输速度小于CURLOPT_LOW_SPEED_LIMIT时,PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取

消传输。

CURLOPT_MAXCONNECTS
允许的最大连接数量,超过是会通过CURLOPT_CLOSEPOLICY决定应该停止哪些连接

CURLOPT_MAXREDIRS
指定最多的HTTP重定向的数量,这个选项是和CURLOPT_FOLLOWLOCATION一起使用的。

CURLOPT_PORT
一个可选的用来指定连接端口的量

CURLOPT_PROXYAUTH
The HTTP authentication method(s) to use for the proxy connection. Use the same bitmasks as

described in CURLOPT_HTTPAUTH. For proxy authentication, only CURLAUTH_BASIC and

CURLAUTH_NTLM are currently supported.

CURLOPT_PROXYPORT
The port number of the proxy to connect to. This port number can also be set in

CURLOPT_PROXY.

CURLOPT_PROXYTYPE
Either CURLPROXY_HTTP (default) or CURLPROXY_SOCKS5.

CURLOPT_RESUME_FROM
在恢复传输时传递一个字节偏移量(用来断点续传)

CURLOPT_SSL_VERIFYHOST
1 to check the existence of a common name in the SSL peer certificate.
2 to check the existence of a common name and also verify that it matches the hostname

provided.

CURLOPT_SSLVERSION
The SSL version (2 or 3) to use. By default PHP will try to determine this itself, although

in some cases this must be set manually.

CURLOPT_TIMECONDITION
如果在CURLOPT_TIMEVALUE指定的某个时间以后被编辑过,则使用CURL_TIMECOND_IFMODSINCE返回页面,

如果没有被修改过,并且CURLOPT_HEADER为true,则返回一个"304 Not Modified"的header,

CURLOPT_HEADER为false,则使用CURL_TIMECOND_ISUNMODSINCE,默认值为CURL_TIMECOND_IFMODSINCE

CURLOPT_TIMEOUT
设置curl允许执行的最长秒数

CURLOPT_TIMEVALUE
设置一个CURLOPT_TIMECONDITION使用的时间戳,在默认状态下使用的是CURL_TIMECOND_IFMODSINCE

CURLOPT_CAINFO
The name of a file holding one or more certificates to verify the peer with. This only makes

sense when used in combination with CURLOPT_SSL_VERIFYPEER.

CURLOPT_CAPATH
A directory that holds multiple CA certificates. Use this option alongside

CURLOPT_SSL_VERIFYPEER.

CURLOPT_COOKIE
设定HTTP请求中"Set-Cookie:"部分的内容。

CURLOPT_COOKIEFILE
包含cookie信息的文件名称,这个cookie文件可以是Netscape格式或者HTTP风格的header信息。

CURLOPT_COOKIEJAR
连接关闭以后,存放cookie信息的文件名称

CURLOPT_CUSTOMREQUEST
A custom request method to use instead of "GET" or "HEAD" when doing a HTTP request. This is

useful for doing "DELETE" or other, more obscure HTTP requests. Valid values are things like

"GET", "POST", "CONNECT" and so on; i.e. Do not enter a whole HTTP request line here. For

instance, entering "GET /index.html HTTP/1.0\r\n\r\n" would be incorrect.
Note: Don't do this without making sure the server supports the custom request method first.

CURLOPT_EGBSOCKET
Like CURLOPT_RANDOM_FILE, except a filename to an Entropy Gathering Daemon socket.

CURLOPT_ENCODING
header中"Accept-Encoding: "部分的内容,支持的编码格式为:"identity","deflate","gzip"。如果

设置为空字符串,则表示支持所有的编码格式

CURLOPT_FTPPORT
The value which will be used to get the IP address to use for the FTP "POST" instruction.

The "POST" instruction tells the remote server to connect to our specified IP address. The

string may be a plain IP address, a hostname, a network interface name (under Unix), or just

a plain '-' to use the systems default IP address.

CURLOPT_INTERFACE
在外部网络接口中使用的名称,可以是一个接口名,IP或者主机名。

CURLOPT_KRB4LEVEL
KRB4(Kerberos 4)安全级别的设置,可以是一下几个值之

一:"clear","safe","confidential","private"。默认的值为"private",设置为null的时候表示禁

用KRB4,现在KRB4安全仅能在FTP传输中使用。

CURLOPT_POSTFIELDS
在HTTP中的"POST"操作。如果要传送一个文件,需要一个@开头的文件名

CURLOPT_PROXY
设置通过的HTTP代理服务器

CURLOPT_PROXYUSERPWD
连接到代理服务器的,格式为"[username]:[password]"的用户名和密码。

CURLOPT_RANDOM_FILE
设定存放SSL用到的随机数种子的文件名称

CURLOPT_RANGE
设置HTTP传输范围,可以用"X-Y"的形式设置一个传输区间,如果有多个HTTP传输,则使用逗号分隔多个

值,形如:"X-Y,N-M"。

CURLOPT_REFERER
设置header中"Referer: " 部分的值。

CURLOPT_SSL_CIPHER_LIST
A list of ciphers to use for SSL. For example, RC4-SHA and TLSv1 are valid cipher lists.

CURLOPT_SSLCERT
传递一个包含PEM格式证书的字符串。

CURLOPT_SSLCERTPASSWD
传递一个包含使用CURLOPT_SSLCERT证书必需的密码。

CURLOPT_SSLCERTTYPE
The format of the certificate. Supported formats are "PEM" (default), "DER", and "ENG".

CURLOPT_SSLENGINE
The identifier for the crypto engine of the private SSL key specified in CURLOPT_SSLKEY.

CURLOPT_SSLENGINE_DEFAULT
The identifier for the crypto engine used for asymmetric crypto operations.

CURLOPT_SSLKEY
The name of a file containing a private SSL key.

CURLOPT_SSLKEYPASSWD
The secret password needed to use the private SSL key specified in CURLOPT_SSLKEY.
Note: Since this option contains a sensitive password, remember to keep the PHP script it is

contained within safe.

CURLOPT_SSLKEYTYPE
The key type of the private SSL key specified in CURLOPT_SSLKEY. Supported key types are

"PEM" (default), "DER", and "ENG".

CURLOPT_URL
需要获取的URL地址,也可以在PHP的curl_init()函数中设置。

CURLOPT_USERAGENT
在HTTP请求中包含一个"user-agent"头的字符串。

CURLOPT_USERPWD
传递一个连接中需要的用户名和密码,格式为:"[username]:[password]"。

CURLOPT_HTTP200ALIASES
设置不再以error的形式来处理HTTP 200的响应,格式为一个数组。

CURLOPT_HTTPHEADER
设置一个header中传输内容的数组。

CURLOPT_POSTQUOTE
An array of FTP commands to execute on the server after the FTP request has been performed.

CURLOPT_QUOTE
An array of FTP commands to execute on the server prior to the FTP request.

CURLOPT_FILE
设置输出文件的位置,值是一个资源类型,默认为STDOUT (浏览器)。

CURLOPT_INFILE
在上传文件的时候需要读取的文件地址,值是一个资源类型。

CURLOPT_STDERR
设置一个错误输出地址,值是一个资源类型,取代默认的STDERR。

CURLOPT_WRITEHEADER
设置header部分内容的写入的文件地址,值是一个资源类型。

CURLOPT_HEADERFUNCTION
设置一个回调函数,这个函数有两个参数,第一个是curl的资源句柄,第二个是输出的header数据。

header数据的输出必须依赖这个函数,返回已写入的数据大小。

CURLOPT_PASSWDFUNCTION
设置一个回调函数,有三个参数,第一个是curl的资源句柄,第二个是一个密码提示符,第三个参数是密

码长度允许的最大值。返回密码的值。

CURLOPT_READFUNCTION
设置一个回调函数,有两个参数,第一个是curl的资源句柄,第二个是读取到的数据。数据读取必须依赖

这个函数。返回读取数据的大小,比如0或者EOF。

CURLOPT_WRITEFUNCTION
设置一个回调函数,有两个参数,第一个是curl的资源句柄,第二个是写入的数据。数据写入必须依赖这

个函数。返回精确的已写入数据的大小

curl_copy_handle()函数的作用是拷贝一个curl连接资源的所有内容和参数

<?php
$ch = curl_init("http://www.baidu.com/");
$another = curl_copy_handle($ch);
curl_exec($another);
curl_close($another);
?>

curl_exec($another);
curl_close($another);
?>

curl_error()函数的作用是返回一个包含当前会话错误信息的字符串。
curl_errno()函数的作用是返回一个包含当前会话错误信息的数字编号。

curl_multi_init()函数的作用是初始化一个curl批处理句柄资源。
curl_multi_add_handle()函数的作用是向curl批处理会话中添加单独的curl句柄资源。

curl_multi_add_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示

一个单独的curl句柄资源。
curl_multi_exec()函数的作用是解析一个curl批处理句柄,curl_multi_exec()函数有两个参数,第一个

参数表示一个批处理句柄资源,第二个参数是一个引用值的参数,表示剩余需要处理的单个的curl句柄资

源数量。
curl_multi_remove_handle()函数表示移除curl批处理句柄资源中的某个句柄资源,

curl_multi_remove_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表

示一个单独的curl句柄资源。
curl_multi_close()函数的作用是关闭一个批处理句柄资源。

<?php
$ch1 = curl_init();
$ch2 = curl_init();
curl_setopt($ch1, CURLOPT_URL, "http://www.baidu.com/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.google.com/");
curl_setopt($ch2, CURLOPT_HEADER, 0);
$mh = curl_multi_init();
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
do {
curl_multi_exec($mh,$flag);
} while ($flag > 0);
curl_multi_remove_handle($mh,$ch1);
curl_multi_remove_handle($mh,$ch2);
curl_multi_close($mh);
?>

curl_multi_getcontent()函数的作用是在设置了CURLOPT_RETURNTRANSFER的情况下,返回获取的输出的

文本流。

curl_multi_info_read()函数的作用是获取当前解析的curl的相关传输信息。

curl_multi_select()
Get all the sockets associated with the cURL extension, which can then be "selected"

PHP安全编程专题

文章所在专题列表如下:

  1. PHP安全编程:register_globals的安全性
  2. PHP安全编程:不要让不相关的人看到报错信息
  3. PHP安全编程:网站安全设计的一些原则
  4. PHP安全编程:可用性与数据跟踪
  5. PHP安全编程:过滤用户输入
  6. PHP安全编程:对输出要进行转义
  7. PHP安全编程:表单与数据安全
  8. PHP安全编程:从URL的语义进行攻击
  9. PHP安全编程:文件上传攻击的防御
  10. PHP安全编程:跨站脚本攻击的防御
  11. PHP安全编程:跨站请求伪造CSRF的防御
  12. PHP安全编程:关于表单欺骗提交
  13. PHP安全编程:HTTP请求欺骗
  14. PHP安全编程:不要暴露数据库访问权限
  15. PHP安全编程:防止SQL注入
  16. PHP安全编程:cookie暴露导致session被劫持
  17. PHP安全编程:session固定获取合法会话
  18. PHP安全编程:session劫持的防御
  19. PHP安全编程:防止源代码的暴露
  20. PHP安全编程:留心后门URL
  21. PHP安全编程:阻止文件名被操纵
  22. PHP安全编程:文件包含的代码注入攻击
  23. PHP安全编程:文件目录猜测漏洞
  24. PHP安全编程:打开远程文件的风险
  25. PHP安全编程:shell命令注入
  26. PHP安全编程:暴力破解攻击
  27. PHP安全编程:密码嗅探与重播攻击
  28. PHP安全编程:记住登录状态的安全做法
  29. PHP安全编程:共享主机的源码安全
  30. PHP安全编程:更优的会话数据安全
  31. PHP安全编程:会话数据注入
  32. PHP安全编程:主机文件目录浏览
  33. PHP安全编程:PHP的安全模式

php函数补完专题

专题列表如下:

  1. PHP函数补完:get_magic_quotes_gpc()
  2. PHP函数补完:error_reporting()
  3. PHP函数补完:preg_match()
  4. PHP函数补完:urlencode()
  5. PHP函数补完:array_multisort()
  6. PHP函数补完:array_splice()
  7. PHP函数补完:isset()
  8. PHP函数补完:getenv()
  9. PHP函数补完:header()
  10. PHP函数补完:mysql_num_rows()
  11. PHP函数补完:list()
  12. PHP函数补完:mysql_query()
  13. PHP函数补完:mysql_fetch_array()
  14. PHP函数补完:number_format()
  15. PHP函数补完:explode()
  16. PHP函数补完:call_user_func()
  17. PHP函数补完:ImageCopyResamples()
  18. PHP函数补完:import_request_variables()
  19. PHP函数补完:parse_url()
  20. PHP函数补完:移除HTML标签strip_tags()
  21. PHP函数补完:输出数组结构与内容var_dump()
  22. PHP函数补完:var_export()
  23. PHP函数补完:判断变量是否为数字is_numeric()
  24. PHP函数补完:session_name()
  25. PHP函数补完:session_id()
  26. PHP函数补完:nl2br()与nl2p()函数
  27. PHP函数补完:shuffle()取数组若干个随机元素

session原理总结

之前在学校的时候,只知道session与cookie的区别在于:session是保存在服务器端,cookie保存在客户端。session怎么样保存的?以文件的形式保存。自己去测试过。有的忘记了。对应session的id号模糊不清。在开发中,非常有必要弄明白具体细节。不能停留在使用session_start()函数了,然后获取session值。不知道里面的机制,在开发中遇到了新的问题,解决起来比较费心。

一、session是怎么保存的?怎么去查看其内容?

session是以文件的形式保存的。php.ini中有个配置项–session.save_path= "";这个里面填写的路径,将会使session文件保存在该路径下。session文件的命名格式是:"sess_[PHPSESSID的值]"。每一个文件,里面保存了一个会话的数据。其实只要使用代码$_SESSION['user_id'] = $value;就会促发php的session机制,结果往对应的session文件中写入一个值。

二、session.save_path路径下这么多的session文件,php是如何确定要调用哪个session文件的?

php是依据,一个名为PHPSESSID的cookie,根据它的值,确定要调用哪个session文件的。去浏览器中,可以看到一个cookie名为PHPSESSID,假如它的值为"sess_adbjsf2q1ass26oootd163sf84",那么,当访问服务器的时候,就会调用session目录下名为"sess_sess_adbjsf2q1ass26oootd163sf84"的文件。其实,PHPSESSID就是一个会话id,以此来确定,哪个是你的会话数据。

cookie的名字PHPSESSID是可以改的,在php.ini中 session.name = PHPSESSID就是设置该cookie的名字。

结合自己实际开发中遇到的问题,总结一下:要说session跟cookie有关联的地方,就是跟PHPSESSID这个cookie有绑定关系。其他,不管你设置什么cookie,使用session的时候是不会用到这些值的。也无法获取到。比如同步登陆,设置即使设置了cookie,而你的应用是依据session判断是否为登陆状态的(事实上也必须如此,因为session保存在服务器端,安全性更高,哪个依据cookie认为你已经登陆,那么很惨)。

所以,这样的情况就会出现,即使成功设置了cookie。也还是不能同步登陆。

三、经常遇到的现象:为什么删除一个session文件,之后生成一个session文件,新的文件名字还是与原来一样?

理解到session文件的命名规则是:“sess_PHPSESSID值“。那么,就很容易明白了。因为,客户端存在cookie:PHPSESSID。客户端发送请求后,会将该cookie发送给服务器(php可以使用$_COOKIE['PHPSESSID']看到其内容),这样的话,还是会根据PHPSESSID生成一个session文件的。

四、如何查看session文件中的session值?

我在开发中发现,如果仅仅依靠session_start()和$_SESSION['user_id']这样的代码,去调试,还不够全面的了解问题所在。比如,我想知道,session_start()到底在完成哪些操作?如果,想动态,实时知道session的值是如何被改写的,打开一个session文件,查看是很了然的。原来,里面就是保存的是一些被序列化后的值。也明白一个知识点,"php圣经"中讲解session的时候,提到session值做被序列化了。下面看到的session内容就是被序列化了。

打开一个session文件,内容如下:

cityID|i:0;cityName|s:3:"all";fanwe_lang|s:5:"zh-cn";fanwe_currency|a:4:{s:2:"id";s:1:"1";s:6:"name_1";s:9:"人民币";s:4:"unit";s:3:"¥";s:5:"radio";s:6:"1.0000";}_fanwe_hash__|s:32:"77c18770c6cb5d89444c407aaa3e8477";

总结出读取规则:1.每一个session的值是以分号";"分开的。比如“cityID|i:0;cityName|s:3:"all";”就是一个完整的session值结束

2.里面的读取规则:符号“|”前面表示session名称。符号后面是该session的具体信息。包括:数据类型,字符长度,内容。上面第一个就相当于使用如下php代码访问:$_SESSION['cityID']

后面的s表示数据类型,这里s说明是字符串类型。3表示字符长度。最后"all"就表示session的具体值了。就是使用代码$_SESSION['cityID']后会得到的结果

3.一个session可以保存一个数组。符号{}表示数组的内容。上面的花括号{}是$_SESSION['fanwe_currency']所保存的内容。要想查看id的值,就使用代码:$_SESSION['fanwe_currency']['id']

五、怎么样理解session_start等函数所做的实际操作是什么?

我是这样理解的:session_start,可以看成是创建一个session文件。假如有原来的session文件,或许没有创建。引入一个。往session文件中写值,那是代码“$_SESSION['']=” 赋值所完成的操作。
session_start()生成一个新的session文件名时。会判断是否存在cookie名为PHPSESSID的值。如果存在,那么就会按照它的值,组合成一个文件名"sess_[phpcookie值]"。所以,在目录下,老是能够看到之前删除过的session文件名。如果将浏览器中对应的cookie删掉。那么就不会生成同样的名字了。如果不存在名为PHPSESSID的cookie。php所做的估计为:先发送一个cookie,然后按照cookie的值生成一个(我可以在浏览器中马上看到一个名为PHPSESSID的cookie)

其实,现在也更加深刻地理解了一个知识:在调用session_start()之前不能有任何输出。有输出就会报错。

session_start()已经封装了发送cookie的操作。涉及到http的一个原理:头部信息必须在内容之前发送才行。所以,使用echo '内容';

header('Content-type: text/xml; charset=gb2312');//头部信息,不算内容

可以这样认为:session_start()内部已经进行了一次发送头部动作。所以之前不能有任何输出内容。
手册中的英文大致是这样说的:创建一个session,或者恢复当前一个session(基于request请求传递的session id)

实际开发应用总结:

只要是同一个用户的操作。导航程序访问记录和团购程序访问的记录都是保存在同一个session文件中

如果是不同的域呢?假如用户访问cs.test.com和daohang.test.com,两方程序都设置了session。那么session的结果

保存在同一个session文件中吗?

因为:服务器是统一管理session文件的存放的。而php引擎是根据phpsessionid的值确定要操作哪个session文件。session

文件名的格式是:"sess_[phpcookie值]"。依次寻找对应的session文件(于是在浏览器查看名为PHPSESSIONID的cookie,过

期时间是在会话结束后)
所以,只要cs.test.com和daohang.test.com使用的是同一台服务器。

这样的话,假如是多台服务器的情况。那么就不得不将session保存在数据库中去。这样实现session共享。跟具体的服务器

是无关的。

session文件是某个用户整个会话过程中数据。那么,假如cs.test.com和daohang.test.com下的两个程序运行在同一

个服务器上。就意味着,访问cs.test.com与访问daohang.test.com是同一个会话。也就意味着,这两边访问后设置的

session数据是保存在同一个session文件中的。可以将名为PHPSESSIONID的cookie,其值看成是一个会话的id。会话结束后,该cookie过期或者被删。那么,服务器对应的session文件(名为"sess_[phpcookie值]")会被删掉吗?查看发现并不会被删掉。所以才会有session文件很多,出现读取性能的问题。session文件比较多的情况下,产生I/Q读写性能问题。了解到可以将session文件分多个目录保存(参考http://www.jb51.net/article/27941.htm)。php.ini中的配置项session.save_path,前面一个值M可以指定目录的深度级别。这个没测试过。需要用到的时候,再去测试一下
 

待解决疑问

一、session的过期时间是怎么确定的?
查看session文件内容,发现里面有个值设置了session文件的过期时间:__HTTP_Session_Expire_TS|i:1297750868;

已掌握的信息:
PHPSESSID该cookie的过期时间在浏览器中显示:会话结束后过期

所有的session文件没有被自动删掉,只是有个过期时间,以此决定:是新生成一个session文件还是使用原来的。

原来:服务器定期session清理机制估计会用到这个东西

二、如果没有设置php.ini中的参数。php默认会将session文件保存到什么位置?

附网文:php.ini中配置session参数的说明。

【Session】

 

[服务端]

session.save_handler = files

默认为file,定义session在服务端的保存方式,file意为把sesion保存到一个临时文件里,如果我们想自定义别的方式保存

(比如用数据库),则需要把该项设置为user;

 

session.save_path = "D:/APMServ5.2.0/PHP/sessiondata/"

定义服务端存储session的临时文件的位置。

 

session.auto_start = 0

如置1,则不用在每个文件里写session_start(); session自动start :)

 

session.gc_probability = 1

session.gc_divisor    = 100

session.gc_maxlifetime = 1440

这三个配置组合构建服务端session的垃圾回收机制

session.gc_probability与session.gc_divisor构成执行session清理的概率,理论上的解释为服务端定期有一定的概率调用gc函数来对session进行清理,清理的概率为:gc_probability/gc_divisor 比如:1/100  表示每一个新会话初始化时,有

1%的概率会启动垃圾回收程序,清理的标准为session.gc_maxlifetime定义的时间。

 

[客户端]

session.use_cookies = 1

sessionid在客户端采用的存储方式,置1代表使用cookie记录客户端的sessionid,同时,$_COOKIE变量里才会有$_COOKIE[

‘PHPSESSIONID’]这个元素存在;

 

session.use_only_cookies = 1

也是定义sessionid在客户端采用的存储方式,置1代表仅仅使用 cookie 来存放会话 ID。一般来说,现在客户端都会支持

cookie,所以建议设置成1,这样可以防止有关通过 URL 传递会话 ID 的攻击。

 

session.use_trans_sid = 0

相对应于上面那个设置,这里如果置1,则代表允许sessionid通过url参数传递,同理,建议设置成0;

 

session.referer_check =  

这个设置在session.use_trans_sid = 1的时候才会生效,目的是检查HTTP头中的"Referer"以判断包含于URL中的会话id是否

有效,HTTP_REFERER必须包含这个参数指定的字符串,否则URL中的会话id将被视为无效。所以一般默认为空,即不检查。  

 

session.name = PHPSESSID

定义sessionid的名称,即变量名,所以通过浏览器http工具看到的http头文件里的PHPSESSID=##############;

 

session.hash_function = 0

选择session_name的加密方式,0代表md5加密,1代表sha1加密,默认是0,但是据说用sha1方式加密,安全性更高;

 

session.hash_bits_per_character = 4

指定在session_name字符串中的每个字符内保存多少位二进制数,这些二进制数是hash函数的运算结果。

4   bits:   0-9,   a-f  

5   bits:   0-9,   a-v  

6   bits:   0-9,   a-z,   A-Z,   "-",   "," 

 

url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=,fieldset="

指定重写哪些HTML标签来包含sid(session_id)(仅在"session.use_trans_sid"打开的情况下有效),URL重写器将添加一个

隐藏的"<input>",它包含了本应当额外追加到URL上的信息。  

 

session.cookie_lifetime = 0

保存sessionid的cookie文件的生命周期,如置0,代表会话结束,则sessionid就自动消失,常见的强行关闭浏览器,就会丢

失上一次的sessionid;

 

session.cookie_path = /

保存sessionid的cookie文件在客户端的位置;

 

session.cookie_domain = /

保存sessionid的cookie的域名设置,这跟cookie允许的域名的访问权限设置有关,一般来说想让自己网站所有的目录都能访

问到客户端的cookie,就应该设置成“/”如需要详细了解,可以看下setcookie()函数的domain参数相关设置和使用方法;

 

session.bug_compat_42 = 1

session.bug_compat_warn = 1

这两个可以说几乎是快要被废弃的设置,是为了老版本的php服务的,主要是针对 session_register函数,因为php5的

register_global默认是关闭状态,所以在php5里根本用不到 session_register这个函数;并且php6就要废除这个设置,直

接定义为关闭,所以没必要研究这两个了;

转自:http://www.cnblogs.com/wangtao_20/archive/2011/02/16/1955659.html

Ci 图片处理

留着说不定什么时候用的上

 

<span style="color:#3333FF;">//缩略图
/**

注意

1、当$config['create_thumb']等于FALSE并且$config['new_image']没有指定
时,会调整原图的大小
2、当$config['create_thumb']等于TRUE并且$config['new_image']没有指定
时,生成文件名为(原图名_thumb.扩展名)

3、当$config['create_thumb']等于FALSE并且$config['new_image']指定时,
生成文件名为$config['new_image']的值

4、当$config['create_thumb']等于TRUE并且$config['new_image']指定时,
生成文件名为(原图名_thumb.扩展名)

  */

  $config['image_library'] = 'gd2';//(必须)设置图像库

  $config['source_image'] = 'ptjsite/upload/55002.jpg';//(必须)设置原始图像的名字/路径

  $config['dynamic_output'] = FALSE;//决定新图像的生成是要写入硬盘还是动态的存在

  $config['quality'] = '90%';//设置图像的品质。品质越高,图像文件越大

  $config['new_image'] = 'ptjsite/upload/resize004.gif';//设置图像的目标名/路径。

  $config['width'] = 575;//(必须)设置你想要得图像宽度。

  $config['height'] = 350;//(必须)设置你想要得图像高度

  $config['create_thumb'] = TRUE;//让图像处理函数产生一个预览图像(将_thumb插入文件扩展名之前)

  $config['thumb_marker'] = '_thumb';//指定预览图像的标示。它将在被插入文件扩展名之前。
例如,mypic.jpg 将会变成 mypic_thumb.jpg

  $config['maintain_ratio'] = TRUE;//维持比例

  $config['master_dim'] = 'auto';//auto, width, height 指定主轴线

  $this->image_lib->initialize($config);

  if (!$this->image_lib->resize()){

  echo $this->image_lib->display_errors();

  }else{

  echo "ok";

  }

  //图像裁剪

  $config['image_library'] = 'gd2';//设置图像库

  $config['source_image'] = 'ptjsite/upload/004.gif';//(必须)设置原始图像的名字/路径

  $config['dynamic_output'] = FALSE;//决定新图像的生成是要写入硬盘还是动态的存在

  $config['quality'] = '90%';//设置图像的品质。品质越高,图像文件越大

  $config['new_image'] = 'ptjsite/upload/crop004.gif';//(必须)设置图像的目标名/路径。

  $config['width'] = 75;//(必须)设置你想要得图像宽度。

  $config['height'] = 50;//(必须)设置你想要得图像高度

  $config['maintain_ratio'] = TRUE;//维持比例

  $config['x_axis'] = '30';//(必须)从左边取的像素值

  $config['y_axis'] = '40';//(必须)从头部取的像素值

  $this->image_lib->initialize($config);

  if (!$this->image_lib->crop())

  {

  echo $this->image_lib->display_errors();

  }else{

  echo "成功的";

  }

  //图像旋转

  $config['image_library'] = 'gd2';//(必须)设置图像库

  $config['source_image'] = 'ptjsite/upload/001.jpg';//(必须)设置原始图像的名字/路径

  $config['dynamic_output'] = FALSE;//决定新图像的生成是要写入硬盘还是动态的存在

  $config['quality'] = '90%';//设置图像的品质。品质越高,图像文件越大

  $config['new_image'] = 'ptjsite/upload/rotate001.jpg';//设置图像的目标名/路径

  $config['rotation_angle'] = 'vrt';//有5个旋转选项 逆时针90 180 270 度 vrt 竖向翻转 hor 横向翻转

  $this->image_lib->initialize($config);

  if ( ! $this->image_lib->rotate())

  {

  echo $this->image_lib->display_errors();

  }

  //文字水印

  $config['image_library'] = 'gd2';//(必须)设置图像库

  $config['source_image'] = 'ptjsite/upload/003.jpg';//(必须)设置原图像的名字和路径. 路径必须是相对或绝对路径,但不能是URL.

  $config['dynamic_output'] = FALSE;//TRUE 动态的存在(直接向浏览器中以输出图像),FALSE 写入硬盘

  $config['quality'] = '90%';//设置图像的品质。品质越高,图像文件越大

  $config['new_image'] = 'ptjsite/upload/crop004.gif';//设置图像的目标名/路径。

  $config['wm_type'] = 'overlay';//(必须)设置想要使用的水印处理类型(text, overlay)

  $config['wm_padding'] = '5';//图像相对位置(单位像素)

  $config['wm_vrt_alignment'] = 'middle';//竖轴位置 top, middle, bottom

  $config['wm_hor_alignment'] = 'center';//横轴位置 left, center, right

  $config['wm_vrt_offset'] = '0';//指定一个垂直偏移量(以像素为单位)

  $config['wm_hor_offset'] = '0';//指定一个横向偏移量(以像素为单位)

  /* 文字水印参数设置 */

  $config['wm_text'] = 'Copyright 2008 - John Doe';//(必须)水印的文字内容

  $config['wm_font_path'] = 'ptj_system/fonts/type-ra.ttf';//字体名字和路径

  $config['wm_font_size'] = '16';//(必须)文字大小

  $config['wm_font_color'] = 'FF0000';//(必须)文字颜色,十六进制数

  $config['wm_shadow_color'] = 'FF0000';//投影颜色,十六进制数

  $config['wm_shadow_distance'] = '3';//字体和投影距离(单位像素)。

  /* 图像水印参数设置 */

  /*

  $config['wm_overlay_path'] = 'ptjsite/upload/overlay.png';//水印图像的名字和路径

  $config['wm_opacity'] = '50';//水印图像的透明度

  $config['wm_x_transp'] = '4';//水印图像通道

  $config['wm_y_transp'] = '4';//水印图像通道

  */

  $this->image_lib->initialize($config);

  $this->image_lib->watermark();

  }

  //图像水印

  $config['image_library'] = 'gd2';//(必须)设置图像库

  $config['source_image'] = 'ptjsite/upload/003.jpg';//(必须)设置原图像的名字和路径. 路径必须是相对或绝对路径,但不能是URL.

  $config['dynamic_output'] = FALSE;//TRUE 动态的存在(直接向浏览器中以输出图像),FALSE 写入硬盘

  $config['quality'] = '90%';//设置图像的品质。品质越高,图像文件越大

  $config['new_image'] = 'ptjsite/upload/crop004.gif';//设置图像的目标名/路径。

  $config['wm_type'] = 'overlay';//(必须)设置想要使用的水印处理类型(text, overlay)

  $config['wm_padding'] = '5';//图像相对位置(单位像素)

  $config['wm_vrt_alignment'] = 'middle';//竖轴位置 top, middle, bottom

  $config['wm_hor_alignment'] = 'center';//横轴位置 left, center, right

  $config['wm_vrt_offset'] = '0';//指定一个垂直偏移量(以像素为单位)

  $config['wm_hor_offset'] = '0';//指定一个横向偏移量(以像素为单位)

  /* 文字水印参数设置 */

  /*

  $config['wm_text'] = 'Copyright 2008 - John Doe';//(必须)水印的文字内容

  $config['wm_font_path'] = 'ptj_system/fonts/type-ra.ttf';//字体名字和路径

  $config['wm_font_size'] = '16';//(必须)文字大小

  $config['wm_font_color'] = 'FF0000';//(必须)文字颜色,十六进制数

  $config['wm_shadow_color'] = 'FF0000';//投影颜色,十六进制数

  $config['wm_shadow_distance'] = '3';//字体和投影距离(单位像素)。

  */

  /* 图像水印参数设置 */

  $config['wm_overlay_path'] = 'ptjsite/upload/overlay.png';//水印图像的名字和路径

  $config['wm_opacity'] = '50';//水印图像的透明度

  $config['wm_x_transp'] = '4';//水印图像通道

  $config['wm_y_transp'] = '4';//水印图像通道

  $this->image_lib->initialize($config);

  $this->image_lib->watermark();

  }</span>

php函数的引用返回

今天忽然想到这个问题 在网上找了篇文章记录一下

<?php
function &test(){
 static $b = 1;
 $b += 2;
 return $b;
}

$a = &test();
$a =8;
$c = test();
echo $c;
exit;

$a=test()方式调用函数,只是将函数的值赋给$a而已,

而$a做任何改变都不会影响到函数中的$b而通过$a=&test()方式调用函数呢,

他的作用是将return $b中的$b变量的内存地址与$a变量的内存地址指向了同一个地方,

即产生了相当于这样的效果($a=&b;) 

所以改变$a的值也同时改变了$b的值所以在执行了 $a=&test();  $a=8;  以后,$c的值变为了10

class a{
 var $abc="ABC";
}

$b=new a;
$c=$b;
echo $b->abc; //这里输出ABC
echo $c->abc; //这里输出ABC
$b->abc="DEF";
echo $c->abc; //这里输出DEF

以上代码是在PHP5中的运行效果,在PHP5中对象的复制是通过引用来实现的。

上列中$b=new a; $c=$b; 其实等效于$b=new a; $c=&$b;
PHP5中默认就是通过引用来调用对象,但有时你可能想建立一个对象的副本,

并希望原来的对象的改变不影响到副本 . 

为了这样的目的,PHP定义了一个特殊的方法,称为__clone。

 

出处:http://blog.csdn.net/tsuliuchao/article/details/8133179

php base64 可以在连接里使用的加密函数

因为要在连接里加参数所以多参数加密 但是用原生的base64 会有一些符号‘/’,‘=’这样的出现就破坏了链接的有效性,所以在网上找到了如下的替代方法测试是有效的。

function base64_en($str){
        $result = base64_encode($str);
        $result = str_replace("/","-",$result);
        $result = str_replace("+","(",$result);
        $i=0;
        while(substr($result,strlen($result)-1)=="="){
                $result = substr($result,0,strlen($result)-1);
                $i++;
        }
        return $result . $i;
}

function base64_de($str){
        $result = str_replace("-","/",$str);
        $result = str_replace("(","+",$result);
        $last = intval(substr($result,strlen($result)-1));
        $normal = substr($result,0,strlen($result)-1);
        if($last==0){return base64_decode($normal);}
        for($i=1;$i<=$last;$i++){
                $normal .= "=";
        }
        return base64_decode($normal);
}

widows.print 不打印的部分

今天在用这个js的 onclick="window.print();的时候发现打印的时候会有按钮也会一起打出来

找了一下原因 解决的办法是

<style type="text/css" media="print">
.noprint { display:none;}
</style>

然后把这个class给容器就可以了 看来是这个media起的效果

jem evoucher submit 每月执行2次

1. 1号0点做16日0:00:00~月尾23:59:59

2. 16号0点做1号0:00:00~15号23:59:59

 

最新修改:

————————————————————————-

(3:48:20 PM) Jason: 11-Dec and the next will be 26-Dec

(3:48:29 PM) Jason: instead of 1-Dec and 16-Dec

26 做 11号00:00:00 ~ 25号 23:59:59

11 做 26号00:00:00 ~ 10号 23:59:59

 

select a.serial_no as VoucherNo, d.storeId, d.storeName
from `member_rewards_evoucher` a, new_purchase b, new_purchase_detail c, store d
where a.`purchase_id` is not null
and a.purchase_id = b.purchase_id
and b.purchase_id = c.purchase_id
and c.store_id = d.storeId
and b.purchase_time between '2014-01-26 00:00:00' and '2014-02-10 23:59:59'
order by storeId asc

select * from voucher_store_submission order by submission_id desc limit 3
#select * from voucher_purchase_requisition where requisition_id = 985

E05000028,E05000029 179292  1338

E05000031    179353  1339

E10000002    179399  1340

INSERT INTO `voucher_store_submission` (`submission_id`, `submission_time`, `store_id`, `user_id`, `requisition_id`, `comment`, `export_cti`, `export_time`, `is_evoucher`)
VALUES
('', '2014-02-11 00:00:00', 179292, 1, '', '\'E05000028\',\'E05000029\'', 'N', NULL, 'Y'),
('', '2014-02-11 00:00:00', 179353, 1, '', '\'E05000031\'', 'N', NULL, 'Y'),
('', '2014-02-11 00:00:00', 179399, 1, '', '\'E10000002\'', 'N', NULL, 'Y')

select * from voucher where prefix = 'E05' and voucher_no in (28,29,31)

update voucher set submission_time = '2014-02-11 00:00:00', status_id = 7, submission_id = '1338' where prefix = 'E05' and voucher_no in (28,29)
update voucher set submission_time = '2014-02-11 00:00:00', status_id = 7, submission_id = '1339' where prefix = 'E05' and voucher_no in (31)
update voucher set submission_time = '2014-02-11 00:00:00', status_id = 7, submission_id = '1340' where prefix = 'E10' and voucher_no in (2)

select * from voucher_lkup_status
select * from voucher_lkup_action 

select * from voucher_action where action_id = 8 limit 1

INSERT INTO `voucher_action` (`id`, `voucher_id`, `action_id`, `action_time`, `user_id`, `comment`, `ct_user`)
VALUES('', 78458, 8, '2014-02-11 00:00:00', 1, '', NULL),
('', 78459, 8, '2014-02-11 00:00:00', 1, '', NULL),
('', 78461, 8, '2014-02-11 00:00:00', 1, '', NULL),
('', 88432, 8, '2014-02-11 00:00:00', 1, '', NULL)