分类目录归档:PHP

奇葩代码重构

让我抓狂的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public static function getFormatContent($code, $arg1='', $arg2='', $arg3='', $arg4='', $arg5='', $arg6='', $arg7='', $arg8='')
{
$format = DictContent::item('message', $code);
if (!empty($format))
return self::formatMessage($format, $arg1, $arg2, $arg3, $arg4, $arg5, $arg6, $arg7, $arg8);
return '';
}

public static function formatMessage($format, $arg1='', $arg2='', $arg3='', $arg4='', $arg5='', $arg6='', $arg7='', $arg8='')
{
$strResult = $format;
if (strlen(strval($arg1)) > 0)
$strResult = str_replace('\1', $arg1, $strResult);

if (strlen(strval($arg2)) > 0)
$strResult = str_replace('\2', $arg2, $strResult);

if (strlen(strval($arg3)) > 0)
$strResult = str_replace('\3', $arg3, $strResult);

if (strlen(strval($arg4)) > 0)
$strResult = str_replace('\4', $arg4, $strResult);

if (strlen(strval($arg5)) > 0)
$strResult = str_replace('\5', $arg5, $strResult);

if (strlen(strval($arg6)) > 0)
$strResult = str_replace('\6', $arg6, $strResult);

if (strlen(strval($arg7)) > 0)
$strResult = str_replace('\7', $arg7, $strResult);

if (strlen(strval($arg8)) > 0)
$strResult = str_replace('\8', $arg8, $strResult);

$strResult = str_replace('\n', "\n", $strResult);
return $strResult;

}

重构了一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static function getFormatContent($code){
$params = func_get_args();
$format = DictContent::item('message', $code);
if (!empty($format))
return self::formatMessage($format, $params);
return '';
}

private static function formatMessage($format, $params){
$strResult = $format;
foreach($params as $k=>$v){
$strResult = str_replace('\'.$k, $v, $strResult);
}

$strResult = str_replace('
\n', "\n", $strResult);
return $strResult;
}

PHP-SOAP 需要记住点

手册以及网上众多的文章,都忽略了一个问题,让我抓狂了一晚上。

PHP5用SOAP扩展写的server,很简单,用PHP5调用,一点问题没有;

偏偏有个PHP4的系统,需要调用SOAP,因为没有扩展可装,只能用nusoap;

于是问题就出现了:nusoap调用成功,接收返回值的时候一直报错,说content type不是xml,是html的,不予接受。

查手册和资料未果,把nusoap的代码看了一遍,发现他有个地方在判断http header的类型,如果不是text/xml的,就拒绝解析返回值。

然后,我在调用Soap Server之前,加了一句:

header(‘Content-type: text/xml’);

世界就清净了。

如果不加这一句强制指定content type,默认是PHP SOAP是按text/html输出的,应该算是个bug?也许。

Zend Framework的bug修正

Zend_Gdata_Photos_UserEntry, 281行

public function getGphotoQuotaCurrent()

{return $this->_gphotoThumbnail; }

正确的应该是:

return $this->_gphotoQuotaCurrent;

检查了一下,最新发布的1.7.0也有此bug,已经提交给Zend了。

用Zend Framework向Blogger发文章的简单类

[php]

<?php
require_once(‘Zend/Gdata.php’);
require_once(‘Zend/Gdata/Query.php’);
require_once(‘Zend/Gdata/ClientLogin.php’);

//向 Blogger发送文章,可自定义Tag
class Blogger{
private $gdClient;
private $blogID;

public function __construct($mail, $password, $blogID){
$service = ‘blogger’;
$client = Zend_Gdata_ClientLogin::getHttpClient($mail, $password, $service);
$this->gdClient = new Zend_Gdata($client);
$this->blogID = $blogID;
}

public function printAllBlogs(){
$query = new Zend_Gdata_Query(‘https://www.blogger.com/feeds/default/blogs’);
$feed = $this->gdClient->getFeed($query);
$this->printFeed($feed);
}

public function printFeed($feed){
$i = 0;
foreach($feed->entries as $entry) {
print_r (split(‘-‘, $entry->id->text));
$i++;
}
}

public function createPublishedPost($title=’Hello, world!’, $content=’I am blogging on the internet.’, $category= ”, $publish){
$uri = ‘https://www.blogger.com/feeds/’ . $this->blogID . ‘/posts/default’;
$entry = $this->gdClient->newEntry();
$entry->title = $this->gdClient->newTitle($title);
$entry->content = $this->gdClient->newContent($content);
$entry->published = $this->gdClient->newPublished($publish);
if(preg_match(‘/,/s’,$category)){
$categorys = explode($category,’,’);
}else{
$categorys[] = $category;
}
$labels = array();
foreach ($categorys as $key =>$value){
$labels[] = new Zend_Gdata_App_Extension_Category($value, ‘http://www.blogger.com/atom/ns#’);
}

$entry->setCategory($labels);

$entry->content->setType(‘text’);

$createdPost = $this->gdClient->insertEntry($entry, $uri);
$idText = split(‘-‘, $createdPost->id->text);
$newPostID = $idText[2];

return $newPostID;
}

}
[/php]

UCenter Home,看起来很美

有人说要用它构建个东西玩,不过要改点功能

于是研究了一下

真是不看不知道

外表看起来似乎和校内、海内还有XX内差不多

其实,内部差了太多了

的确,UCenter Home看起来功能强大

可是,如果要用它跑应用

我看,还是歇了吧

具体的构架缺陷我就不说了,免得让人说我矫情

下个结论:

这玩意只适合小网站主玩玩而已

可以预见的是,用户到了一个量级的时候(这个量对互联网来说绝对是微量)

这玩意就要吃人了

到时候,哭去吧,改去吧

习惯成自然

写代码写久了,有的习惯就养成了

比如敲了一个大括号,顺手肯定会把另外一半也敲上

写php也写了有段时间了,一直都是<?php开头 ,然后顺手敲上 ?> 结尾

今天看Zend frameword的文档,才突然发现,原来

对于只包含有 PHP 代码的文件,结束标志(”?>”)是不允许存在的,PHP自身不需要(”?>”), 这样做, 可以防止它的末尾的被意外地注入空白并显示输出。

原来如此,之前在看Zf的例子代码的时候就在奇怪为什么没有?>结尾,一直没去好好想,现在刚明白

回头去修改类代码。

Zend_Acl很好很灵活

看似很简单,其实不然

使用的当的话,几乎可以精确控制到页面操作的每个细节

非常灵活

只是Zend的文档写的太不详细了,害我琢磨了很久

测试Zend_Search_Lucene的效率

昨天小数据量测试通过,查询效率还不错

今天准备了2000万的数据,估计全部索引完得好几天了

开了10进程同时索引中

PS:Zend_Search_Lucene的使用还是很方便的,不过就是文档太缺了

================

update:2008-06-26

测试效果不怎么理想,Lucene的索引更适合一次索引,永远不变的情况

更新索引,再优化,速度非常的慢

目前索引大小1.5G,进行更新,再优化,整整花了1天多的时间

Zend_Search_Lucene怎么会占用这么大内存呢

玩ZendFramework的Lucene

建了一个大约100万记录的索引

搜索的时候总是报内存耗尽

检查Httpd的运行状态,发现一开始查询,消耗内存就开始猛增,最高能到800M……

Google了N次,没有找到原因,百思不得其解,暂且放一放

=========================

TNND,找到原因了,Analyzer设错了

现在检索速度还可以

准备调整技术路线

由 php+apache+mysql+FreeBSD 更新为 php+lighttpd+pgsql+FreeBSD

调整的要点在于:尽量放弃非BSD协议的开源软件

MySQL自从被收购以后,已经让人感觉到不安全了;

而Apache慢慢的发展成了一个庞大的怪兽,扩展性变得比性能还要重要,结果就是越来越慢~