php基础语法知识笔记(二)
算上上一篇《php基础语法知识笔记(一)》,所有的PHP基础语法笔记就整理完成了。回头看看这一个半月的收获真是不小。回头我打算把JavaScript和HTML、CSS+DIV的笔记也都整理一遍,这样基础知识也算是告一段落了,此外,以后如果还有需要补充的基础知识点,我会陆续的写在php基础知识笔记(补)中。
1.错误提示
Warning: Invalid argument supplied for foreach() in
主要的原因是foreach (array as value)
array 必须是数组才能实现,解决办法是一是判断是数组才能执行foreach如
if(is_array(array)){ foreach (array as value){ }}或者if(!empty($arr)){ foreach( $arr as $key => $value){ //todo } }
第二种办法是
foreach (array(array) as value){}
2.exit()终止程序
3.在某一个页面定义了一个变量,这个变量在整个网站的其他页面都能直接调用;
//生成$_SESSION['name'];
session_start(); //开启会话功能
$_SESSION['username'] = 'LIN'; //必须先运行程序赋值的页面
//调用 12.php
session_start(); //在调用session_start()之前,不能有任何字符的输出,包括PHP代码,HTML以及空格和换行,因此,session_start(),要写在最顶端。
echo $_SESSION['username'];
$_SESSION在服务器端生成文件,安全性高。保存管理员信息。Session 是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID为标识符来存取 服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一SessionID 提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。 服务器也可以通过URL重写的方式来传递SessionID的值,因此不是完全依赖Cookie。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。
$_COOKIE在客户端硬盘生成文件,即本地文件,记录会员信息。
PHP中的session有效期默认是1440秒(24分钟),也就是说,客户端超过24分钟没有刷新,当前session就会失效。要修改这个默认值,正确的解决办法是修改配置参数session.gc_maxlifetime。
为了彻底解决这个问题,需要对PHP的工作细节进行进一步的分析。
在默认情况下,PHP 中的session信息会以文本文件的形式,被保存在系统的临时文件目录中。这个路径由配置参数session.save_path指定。在Linux 下,这一路径通常为tmp,在 Windows下通常为C:WindowsTemp。当服务器上有多个PHP应用时,它们会把自己的session文件都保存在同一个目录中(因为它们使 用同一个session.save_path参数)。同样地,这些PHP应用也会按一定机率启动GC,扫描所有的session文件。
问题在于,GC在工作时,并不会区分不同站点的session。举例言之,站点A的gc_maxlifetime设置为2小时,站点B的 gc_maxlifetime设置为默认的24分钟。当站点B的GC启动时,它会扫描公用的临时文件目录,把所有超过24分钟的session文件全部删 除掉,而不管它们来自于站点A或B。这样,站点A的gc_maxlifetime设置就形同虚设了。
找到问题所在,解决起来就很简单了。在页面的开始处调用session_save_path()函数,它能够修改 session.save_path参数,把保存session的目录指向一个专用的目录,例如tmpmyapp。这样,gc_maxlifetime参 数就工作正常了。
使用公用的session.save_path还会导致安全性问题,因为这意味着,同一台服务器上的其它PHP程序也可以读取你的站点的 session文件,这可能被用于黑客攻击。另一个问题是效率:在一个繁忙的站点中,可能存在成千上万个session文件,而把许多不同网站的 session文件都放在同一个目录下,无论是对单个文件的读写,还是遍历所有文件进行GC,都无疑会导致性能的降低。因此,如果你的PHP应用和别的 PHP应用运行在同一台服务器上的话,强烈建议你使用自己的session.save_path。
严格地来说,这算是PHP的一个bug。当PHP在进行GC时,它应该区别来自不同站点的session文件,并应用不同的gc_maxlifetime值。目前,最新的PHP 5.2.X仍然存在这个问题。
上文说到,在一个繁忙的站点中,可能存在成千上万个session文件,即使区分了不同站点的session.save_path目录,单个站点的session文件数目仍然可能导致效率问题。为了解决这一问题,可行的几种方法有:
如果PHP运行在Linux系统下,使用ReiserFS文件系统取代默认的ext2/ext3文件系统。ReiserFS对于大量小文件的存取性能,比ext2/ext3有极大的提高。
将session.save_path指向一个内存路径。这意味着,session文件的读写只在内存中进行,而不执行磁盘操作。
session.save_path接受一个额外的N参数,用于指定目录的级数。例如,“5;/tmp” 将导致创建类似这样的session文件:/tmp/4/b/1/e/3 /sess_4b1e384ad74619bd212e236e52a5a174If。具体的说明,请参见:http://cn.php.net /manual/en/session.configuration.php#ini.session.save-path
终极的解决方案,是放弃PHP的session处理机制,自己编码接管所有的session处理操作,通过 session_set_save_handler()函数来实现。通过自己接管session处理,可以将所有的session保存在专门的数据库(往 往使用内存表)中,从而彻底解决session文件带来的问题,并且可以方便地实现session的共享和复制。这也是大型的PHP应用一般会使用的方 式。关于session_set_save_handler()函数的使用,网上和相关图书都有详细的说明,这里不再赘述。值得一提的是,即使在这种方式 下,启动GC的概率仍然取决于session.gc_probability/session.gc_divisor。
setcookie('下标','值','有效时间','访问路径');
setcookie('name','futan','time()+24*60*60*14','/admin/'),$_COOKIE['name']的有效时间为两周。根目录下的admin文件夹才能访问Cookie文件。有效时间写成'-1'的时候,cookies永久保存。
setcookie()函数,Cookies不会在设置的本页马上生效(只能在本页刷新或者跳转到其他页面输出)。
4.浏览器对cookies的限制。
一、浏览器允许每个域名所包含的 cookie 数:
- Microsoft 指出 Internet Explorer 8 增加 cookie 限制为每个域名 50 个。
- Firefox 每个域名 cookie 限制为 50 个。
- Opera 每个域名 cookie 限制为 30 个。
- Safari/WebKit 貌似没有 cookie 限制。但是如果 cookie 很多,则会使 header 大小超过服务器的处理的限制,会导致错误发生。
注:“每个域名 cookie 限制为 20 个”将不再正确!
二、当很多的 cookie 被设置,浏览器如何去响应。除 Safari(可以设置全部cookie,不管数量多少),有两个方法:
- 最少最近使用(least recently used (LRU))的方法:当 Cookie 已达到限额,自动踢除最老的 Cookie ,以使给最新的 Cookie 一些空间。 Internet Explorer 和 Opera 使用此方法。
- Firefox 很独特:虽然最后的设置的 Cookie 始终保留,但似乎随机决定哪些 cookie 被保留。似乎没有任何计划(建议:在 Firefox 中不要超过 Cookie 限制)。
三、不同浏览器间 cookie 总大小也不同:
- Firefox 和 Safari 允许 cookie 多达 4097 个字节, 包括名(name)、值(value)和等号。
- Opera 允许 cookie 多达 4096 个字节, 包括:名(name)、值(value)和等号。
- Internet Explorer 允许 cookie 多达 4095 个字节, 包括:名(name)、值(value)和等号。
注:多字节字符计算为两个字节。在所有浏览器中,任何 cookie 大小超过限制都被忽略,且永远不会被设置。
5.$_REQUEST[]具用$_POST[] $_GET[]的功能,但是$_REQUEST[]比较慢。通过post和get方法提交的所有数据都可以通过$_REQUEST数组获得。
当有两个超全局变量中的成员名称相同的时候,查看配置文件INI.PHP,查找variables_order = "EGPCS";
$_ENV 是一个环境变量(全局),也是一个数组,不同的系统包含的环境变量不同,
当表单提交过多的时候。数据处理层处理很多相同的量(如:id),可以一次性输出不同提交类型(GET或POST)的量。
6.常用$_SERVER数组
$_SERVER['QUERY_STRING']; //域名
$_SERVER['HTTP_REFERER']; //记录来源页面
$_SERVER['REMOTE_ADDR']; //返回访问者的IP,与IP地址库结合起来可以记录来访者的地区。
7.foreach($arr as $str)语句遍历数组成员
$arr = array(
'db'=>213,
12 =>35,
36,
"futan"
);
if( is_array($arr) )
{
foreach($arr as $str)
{
echo $str;
}
}
echo $str; //输出futan,$str此时等于数组中的最后一个
if( is_array($arr) )
{
foreach($arr as $key => $str)
{
echo '下标为'.$key.'的值为'.$str.'<br />'; //输出数组成员的下标
}
}
//$arr[$key] 与 $str相等;