存档

‘PHP’ 分类的存档

Zend Framework升级带来的麻烦

2009年10月20日 没有评论

zend-framework
俺的Zend Framework很久没有升级了,一直用的1.5。看到官方已经update到1.9了,就趁着2.0没发布之前先升到最新版吧!
不过一更新,本来跑的好好的程序down掉了,提示找不到文件:

1
2
3
Warning: require_once(Zend_Db_Adapter_Pdo_Mysql.php) [function.require-once]: failed to open stream: No such file or directory in E:\project\bbs\shenmu\plugins\101\www\index.php on line 7
 
Fatal error: require_once() [function.require]: Failed opening required 'Zend_Db_Adapter_Pdo_Mysql.php' (include_path='../application/models;../../library;.') in E:\project\bbs\shenmu\plugins\101\www\index.php on line 7

这个文件的确不存在,是个类的路径名,不过伟大的ZF不应该帮我们自动翻译识别出来吗?以前好好的,现在不行了。记得当初给另一个程序升级到1.7时出现过类似的错误:

1
2
3
Warning: require_once(Zend_Controller_Action.php) [function.require-once]: failed to open stream: No such file or directory in E:\project\bbs\shenmu\plugins\101\www\index.php on line 7
 
Fatal error: require_once() [function.require]: Failed opening required 'Zend_Controller_Action.php' (include_path='../application/models;../../library') in E:\project\bbs\shenmu\plugins\101\www\index.php on line 7

在bootstrap加一行Zend_Loader::loadClass(‘Zend_Controller_Action’);就OK。原来,随着Zend Framework的升级,程序效率问题越来越受到重视,很多以前会自动加载的类现在都要手动指定了才行了。1.7取消了自动加载Zend_Controller_Action,现在1.9又取消了Db_Adapter。现在想偷懒是不行了,如果你遇到上面的问题,记得在你的启动文件里加上:

1
2
3
Zend_Loader::loadClass('Zend_Controller_Action');
Zend_Loader::loadClass('Zend_Db_Adapter_Pdo_Mysql');
Zend_Loader::loadClass('Zend_Db_Profiler');

他人在说:

由于改进了 Zend_Loader 和 Zend_Controller,性能应该会得到提升。这个改进是 Zend Framework 提高效率的体现,需要用到什么包就加载什么包,以前需要提高效率那么只能使用 require_once 或 include_once 这样的语法,而使用registerLoader又会不管3721都加载指定的include_path的内容,那么明显降低了效率。

分类: PHP 标签:

使用file_get_contents提交http post

2009年9月4日 没有评论

以前使用curl获取需要登陆内容的文章,但其实,自5.0开始,使用file_get_contents就可以完成.(前提是开启了allow_url_fopen),下面以一个简单的例子说明一下:
1.先看一下目标网页(假设是http://localhost/response.php)
response.php

1
2
3
4
5
< ?php  
 echo "<pre>";  
 print_r($_POST);  
 print_r($_COOKIE);  
 ?>

本文讲述的只是http post请求的发送,所以,目标页只是回显所收到的post和cookie
阅读全文…

分类: PHP 标签:

PHP里面全局变量不能生效的问题

2009年9月4日 没有评论

一直以为,全局变量(使用global声明)是在程序的所有地方都可以用的(不然怎么能叫全局?呵),但在最近的工作中,接连碰到几次全局变量无效的郁闷的事,记录一下出现的原因.
1.错误重现
问题出现在用我的简易框架时,在view中使用原来第三方定义好的函数时(此函数比较独立),下面模拟一下:

t1.php
PHP代码

1
2
3
4
5
6
7
<?
run(); //执行
function run(){
include 'func.php';
showGlobal();
}
?>

func.php
PHP代码

1
2
3
4
5
6
7
<?
 $vars = 'I am global!';
 function showGlobal(){
     global $vars;
     print('我使用全局变量:'.$vars);
 }
?>

很简单的两个文件(第一次发现问题时,远比这复杂,在一层层排错后,得出最少化的问题重现环境),func.php是定义好的第三方函数,该函数使用了一些全局变量,如果这时把这两个文件放在一起,执行一下t1.php,会发现showGlobal里的$vars是显示不出来的,global失效了?
2.错误原因
搜索后发现,php.net上很早就有人提出过,也有人给出了解释(http://bugs.php.net/bug.php?id=2193):
原来,在t1.php的run函数中include func.php时,func.php中的变量$vars的作用域只是在run之内,而在showGlobal中使用global声明的$vars是要求属于t1.php的不是run函数的,所以为空)
3.解决方法
知道原因后,解决就很简单,可以把include 从run中移出来,这样,func.php中的$vars就属于t1.php了;也可以在run里用global声明一下$vars,这样也可以把原来属于run的$vars声明为全局(属于t1.php);

虽然问题可以简决,但用起来还是很不爽, 因为在我的phpec框架中,include的情况比较普遍,不可能把view中按需include的移到外层去,使用global的话,我在使用第三方函数时,又不会也不想去了解它用了什么全局变量,而且,层次结构一多,就….

总结:1)尽量减少多级和函数中include文件.2)尽量不用全局变量

本贴转自:http://www.phpec.com

分类: PHP 标签:

PHP面试题系列五【附答案】

2009年7月31日 没有评论

[coolcode lang="php"]
PHP面试题系列五【附答案】
[ 2007-4-10 23:27:00 | By: jany ]

一、基础题

1. 写出如下程序的输出结果
$str1 = null;
$str2 = false;
echo $str1==$str2 ? ‘相等’ : ‘不相等’;

$str3 = ”;
$str4 = 0;
echo $str3==$str4 ? ‘相等’ : ‘不相等’;

$str5 = 0;
$str6 = ‘0′;
echo $str5===$str6 ? ‘相等’ : ‘不相等’;
?>

2. 写出如下程序的输出结果
$a1 = null;
$a2 = false;
$a3 = 0;
$a4 = ”;
$a5 = ‘0′;
$a6 = ‘null’;
$a7 = array();
$a8 = array(array());

echo empty($a1) ? ‘true’ : ‘false’;
echo empty($a2) ? ‘true’ : ‘false’;
echo empty($a3) ? ‘true’ : ‘false’;
echo empty($a4) ? ‘true’ : ‘false’;
echo empty($a5) ? ‘true’ : ‘false’;
echo empty($a6) ? ‘true’ : ‘false’;
echo empty($a7) ? ‘true’ : ‘false’;
echo empty($a8) ? ‘true’ : ‘false’;
?>

3. 写出如下程序的输出结果
$test = ‘aaaaaa’;
$abc = & $test;
unset($test);

echo $abc;
?>

4. 写出如下程序的输出结果
$count = 5;
get_count()
{
static $count = 0;
return $count++;
}

echo $count;
++$count;
echo get_count();
echo get_count();
?>

5. 写出如下程序的输出结果
$GLOBALS['var1'] = 5;
$var2 = 1;
get_()
{
global $var2;
$var1 = 0;
return $var2++;
}
get_();

echo $var1;
echo $var2;
?>

6. 写出如下程序的输出结果
get_arr($arr)
{
unset($arr[0]);
}
$arr1 = array(1, 2);
$arr2 = array(1, 2);

get_arr(&$arr1);
get_arr($arr2);

echo count($arr1);
echo count($arr2);
?>

7. 使用五种以上方式获取一个文件的扩展名

要求:dir/upload.image.jpg,找出 .jpg 或者 jpg ,
必须使用PHP自带的处理函数进行处理,方法不能明显重复,可以封装成函数,比如 get_ext1($file_name), get_ext2($file_name)

二、算法题

1. 使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组

2. 使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组

3. 写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数

答案(以下答案不一定是最好的,只是一个简单的参考)

一、基础题

1. 相等 相等 不相等

2. true true true true true false true false

3. aaaaaa

4. 5 0 1

5. 5 2

6. 1 2

7. 使用五种以上方式获取一个文件的扩展名
[/coolcode]

分类: PHP 标签:

将PHP的SimpleXML文档对象转换为标准数组

2009年6月12日 没有评论

[coolcode lang="PHP"]
/**
* SimpleXML对象转换为数组
*
* @param obj $obj SimpleXML 对象
* @return array 经过转换的数组
*/
function simplexml_obj2array($obj){
if ($obj instanceof SimpleXMLElement) {
$obj = (array)$obj;
}

if (is_array($obj)) {
$result = $keys = array();
foreach( $obj as $key=>$value)
{
isset($keys[$key]) ? ($keys[$key] += 1) : ($keys[$key] = 1);

if( $keys[$key] == 1 )
{
$result[$key] = simplexml_obj2array($value);
}
elseif( $keys[$key] == 2 )
{
$result[$key] = array($result[$key], simplexml_obj2array($value));
}
else if( $keys[$key] > 2 )
{
$result[$key][] = simplexml_obj2array($value);
}
}
return $result;
} else {
return $obj;
}

}
[/coolcode]

分类: PHP 标签:

数据库建立索引规则

2009年6月3日 没有评论

index
建立索引常用的规则如下:
1、表的主键、外键必须有索引;

2、数据量超过300的表应该有索引;

3、经常与其他表进行连接的表,在连接字段上应该建立索引;

4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;

5、索引应该建在选择性高的字段上;

6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;

7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:

A、正确选择复合索引中的主列字段,一般是选择性较好的字段;

B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;

C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;

D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;

E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

8、频繁进行数据操作的表,不要建立太多的索引;

9、删除无用的索引,避免对执行计划造成负面影响;

以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大

分类: PHP 标签:

添加换行符防止fsockopen超时

2009年5月26日 没有评论

[coolcode lang="php"]
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)
\n”;
} else {
$out = “GET / HTTP/1.1\r\n”;
$out .= “Host: www.example.com\r\n”;
$out .= “Connection: Close\r\n\r\n”;

fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
?>
[/coolcode]
摘自PHP手册.
如果不注意out数据中的换行符问题,将上例中的

$out .= “Connection: Close\r\n\r\n”;

不小心写成

$out .= “Connection: Close\r\n”;

就会出现fsockopen运行60秒超时的情况
socket-timeout
所以一定要记住以两个”\r\n”结尾.而且一定是out的最后一行,已表明结束!否则socket会一直等着你哦!

分类: PHP 标签:

http_build_query函数带来的困扰

2009年5月22日 没有评论

http_build_query是用来生成URL请求字符串的函数,很简单.不过今天却出现了一点小意外,在本机安装公司社区时,出现了无法登录的情况.但在测试服务器正常.经过地毯式排错,找到问题代码(仅演示,屏蔽敏感内容):
[coolcode lang="php"]
$Args = array(
“usr” => “touchboy”,
“pwd” => “123456″,
“ip” => “127.0.0.1″,
“src” => “account”
);
$query= http_build_query( $Args );

[/coolcode]
阅读全文…

分类: PHP 标签: