把一个数组按照一定长度截取到另外一个数组中:
$arraydisplay = array_chunk($arraydisplay,10,TRUE);//截取前10个人的数据给smarty
$uids = array();//强制$uids由string改为array()类型
$uids = array_keys($json2array);//把数组的键放到一个数组中。当然可以通过foreach实现,但没有必要!
array_slice -- 从数组中取出一段.
arsort($json2array);
-- 对数组进行逆向排序并保持索引关系
本例输出如下:
$arraydisplay = array_chunk($arraydisplay,10,TRUE);//截取前10个人的数据给smarty
$uids = array();//强制$uids由string改为array()类型
$uids = array_keys($json2array);//把数组的键放到一个数组中。当然可以通过foreach实现,但没有必要!
array_slice -- 从数组中取出一段.
arsort($json2array);
-- 对数组进行逆向排序并保持索引关系
<?php
$fruits = array ("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
arsort ($fruits);
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
echo "$key = $val\n";
}
?>
$fruits = array ("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
arsort ($fruits);
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
echo "$key = $val\n";
}
?>
本例输出如下:
a = orange
d = lemon
b = banana
c = apple
d = lemon
b = banana
c = apple
开发中偶尔会遇到需要跳转页面后到达页面的最上方,如何处理呢?锚点!
方法:在各个页面里面下面就立马加入:
那在页面内呢?
在点击这儿后跳到下描点位置,这儿代码
锚点位置代码:
EOF!
方法:在各个页面里面下面就立马加入:
<a id="top1" name="top1"></a>
<div class="PY_page">
{if $page.totalpage > 1}
<ul class="PY_pages">
{if $page.pagenum > 1}
<li class="PY_pgprev"><a href="{$page.previouspage}#top1" class="Ap_tf"><上一页</a> </li>
{/if}
{foreach from=$pagelistarray item=pagelist}
{if $pagelist.num == $page.pagenum}
<li class="PY_pgon">{$pagelist.num}</li>
{else}
<li><a href='{$pagelist.url}#top1'>{$pagelist.num}</a></li>
{/if}
{/foreach}
{if $page.pagenum < $page.totalpage}
<li class="PY_pgnext"><a href="{$page.nextpage}#top1" class="Ap_tf">下一页></a></li>
{/if}
</ul>
{/if}
</div>
{if $page.totalpage > 1}
<ul class="PY_pages">
{if $page.pagenum > 1}
<li class="PY_pgprev"><a href="{$page.previouspage}#top1" class="Ap_tf"><上一页</a> </li>
{/if}
{foreach from=$pagelistarray item=pagelist}
{if $pagelist.num == $page.pagenum}
<li class="PY_pgon">{$pagelist.num}</li>
{else}
<li><a href='{$pagelist.url}#top1'>{$pagelist.num}</a></li>
{/if}
{/foreach}
{if $page.pagenum < $page.totalpage}
<li class="PY_pgnext"><a href="{$page.nextpage}#top1" class="Ap_tf">下一页></a></li>
{/if}
</ul>
{/if}
</div>
那在页面内呢?
在点击这儿后跳到下描点位置,这儿代码
:<a href="#top1">如何获得积分</a>
锚点位置代码:
<a id="top1" name="top1">如何获得积分</a>
EOF!
$uids = array();
foreach($json2array as $keyuid =>$scorevalues)
{
$uids[] = $keyuid;
}
$uids = array_keys($json2array);
foreach($json2array as $keyuid =>$scorevalues)
{
$uids[] = $scorevalues;
}
$uids = array_values($json2array);
还没写完,待续。。。
[实践OK]Shell逐行读取文件的3种方法while read line ;do echo $line; done < sort.txt,有谁知道在shell读取一个文本文件中的内容并赋值到一个变量
一行搞定:
效率最高:
#while read line
> do
> echo $line
> done < sort.txt
jack 1984
jack 1928
jack 19834
jack 1984
jack 1984
jack 1984
xiangdong 1988
xiangdong 1988
xiangdong 1988
xiangdong 1988
xiangdong 1988
xiangdong 1988
#cat sort.txt |while read LINE
> do
> echo $LINE
> done
jack 1984
jack 1928
jack 19834
jack 1984
jack 1984
jack 1984
xiangdong 1988
xiangdong 1988
xiangdong 1988
xiangdong 1988
xiangdong 1988
xiangdong 1988
#for line in $(cat sort.txt )
> do
> echo ${line}
> done
jack
1984
来自:https://www.cnblogs.com/mgzc-1508873480/p/7866915.html
效率最高:
#while read line
> do
> echo $line
> done < sort.txt
jack 1984
jack 1928
jack 19834
jack 1984
jack 1984
jack 1984
xiangdong 1988
xiangdong 1988
xiangdong 1988
xiangdong 1988
xiangdong 1988
xiangdong 1988
#cat sort.txt |while read LINE
> do
> echo $LINE
> done
jack 1984
jack 1928
jack 19834
jack 1984
jack 1984
jack 1984
xiangdong 1988
xiangdong 1988
xiangdong 1988
xiangdong 1988
xiangdong 1988
xiangdong 1988
#for line in $(cat sort.txt )
> do
> echo ${line}
> done
jack
1984
来自:https://www.cnblogs.com/mgzc-1508873480/p/7866915.html
foreachbreak.php
Result:
0=>10
1=>12
答案:能break!
continue test:
0=>10
1=>12
3=>25
答案:也能continue!
<?php
$i = array (10, 12, 13, 25);
foreach ($i as $key =>$value) {
if(13 == $value)
{
break;
}
echo $key."=>".$value."\n";
}
?>
$i = array (10, 12, 13, 25);
foreach ($i as $key =>$value) {
if(13 == $value)
{
break;
}
echo $key."=>".$value."\n";
}
?>
Result:
0=>10
1=>12
答案:能break!
continue test:
<?php
$i = array (10, 12, 13, 25);
foreach ($i as $key =>$value) {
if(13 == $value)
{
continue;
}
echo $key."=>".$value."\n";
}
?>
$i = array (10, 12, 13, 25);
foreach ($i as $key =>$value) {
if(13 == $value)
{
continue;
}
echo $key."=>".$value."\n";
}
?>
0=>10
1=>12
3=>25
答案:也能continue!
一、for循环
最简单也是最直接的方法,用for循环来遍历数组。对于已知维数的数组可以判断,但如果是未知的多维数组,该怎么办?
二、implode();
用implode()将数组输出为字符串,判断输出的字串是否为空。初看上去似乎是个不错的方法,可惜跟上一点一样,对于二维以上数组就不行了。举个例子:
很明显$arr是个含有三个空数组的二维数组,应该也算是空的,可是输出的确是非空。判断失败。
三、count();
不得不承认,我最先想到的也是这个函数,网上也有好多网友把这个当答案,并以为已经解决问题。可是请看下面的例子:
不多说,还是看例子:
$arr= array("d","s","");
echo in_array('', $arr);
这个只能说明数组中有空的元素,不能证明数组是空的。很明显也不行
五、empty();
这个cpyeh觉得跟前面几种方法差不多
结果还是非空
可以在以上例子上加一句print_r($arr);看看...
基本上cpyeh能想到的加上网上找到的也就以上这些,不明白的是网上居然有人会提到is_array(),可能是对php还不是很了解,需要多翻翻手册。很遗憾最终还是找不到一个完美的解决方法,不过对于一般的应用,第一种或第二种应该可以满足了,cpyeh选了方便的第二种。如果对以上例子有疑问欢迎留言在此互相交流。
后计:
如果判断一个二维数组可以这样,同时干掉那些空的:
QQ群有哥们用下面函数来做这个事情:
用正则:
但如果是多维的呢?PHP内核团队能专们提出一个函数来判断和并且去掉多维的键值吗?期待中。。。
最简单也是最直接的方法,用for循环来遍历数组。对于已知维数的数组可以判断,但如果是未知的多维数组,该怎么办?
二、implode();
用implode()将数组输出为字符串,判断输出的字串是否为空。初看上去似乎是个不错的方法,可惜跟上一点一样,对于二维以上数组就不行了。举个例子:
$arr= array(array(),array(),array());
$str = implode(',',$arr);
if(empty($str)) echo "空";
else echo "非空";
$str = implode(',',$arr);
if(empty($str)) echo "空";
else echo "非空";
很明显$arr是个含有三个空数组的二维数组,应该也算是空的,可是输出的确是非空。判断失败。
三、count();
不得不承认,我最先想到的也是这个函数,网上也有好多网友把这个当答案,并以为已经解决问题。可是请看下面的例子:
$arr= array("","","");
echo count($arr);
四、in_array('', $arr));echo count($arr);
不多说,还是看例子:
$arr= array("d","s","");
echo in_array('', $arr);
这个只能说明数组中有空的元素,不能证明数组是空的。很明显也不行
五、empty();
这个cpyeh觉得跟前面几种方法差不多
$arr= array("","","");
if(empty($arr)) echo "空";
else echo "非空";
if(empty($arr)) echo "空";
else echo "非空";
结果还是非空
可以在以上例子上加一句print_r($arr);看看...
基本上cpyeh能想到的加上网上找到的也就以上这些,不明白的是网上居然有人会提到is_array(),可能是对php还不是很了解,需要多翻翻手册。很遗憾最终还是找不到一个完美的解决方法,不过对于一般的应用,第一种或第二种应该可以满足了,cpyeh选了方便的第二种。如果对以上例子有疑问欢迎留言在此互相交流。
后计:
如果判断一个二维数组可以这样,同时干掉那些空的:
$this->dataObj->getTotalScore(&$resultinfo,$uids);
$judge = implode("",$resultinfo);
if(!empty($judge))//数组不为空
{ //去掉数组键值为空
foreach($resultinfo as $key =>$getoutvisnull)
{
if(empty($getoutvisnull))
{
unset($resultinfo[$key]);
}
}
$allscorearray[] = $resultinfo;
}
$judge = implode("",$resultinfo);
if(!empty($judge))//数组不为空
{ //去掉数组键值为空
foreach($resultinfo as $key =>$getoutvisnull)
{
if(empty($getoutvisnull))
{
unset($resultinfo[$key]);
}
}
$allscorearray[] = $resultinfo;
}
QQ群有哥们用下面函数来做这个事情:
function array_null($arr){
if(is_array($arr)){
foreach($arr as $k=>$v){
if($v&&!is_array($v)){
return false;
}
$t=array_null($v);
if(!$t){
return false;
}
}
return true;
}else{
if(!$arr){
return true;
}
return false;
}
}
$node=array(array(),array(),array(array()));
if(array_null($node)){
echo "fdsa";
}
if(is_array($arr)){
foreach($arr as $k=>$v){
if($v&&!is_array($v)){
return false;
}
$t=array_null($v);
if(!$t){
return false;
}
}
return true;
}else{
if(!$arr){
return true;
}
return false;
}
}
$node=array(array(),array(),array(array()));
if(array_null($node)){
echo "fdsa";
}
用正则:
if (trim(preg_replace("/(\w+\s*=>\s*)?array\s*\(|\),\s+|\)$/i","",var_export($arr,true)))){
echo 'true';
}
else{
echo "false";
}
echo 'true';
}
else{
echo "false";
}
但如果是多维的呢?PHP内核团队能专们提出一个函数来判断和并且去掉多维的键值吗?期待中。。。
原型:
配置文件分离:
define.php
ZZZ.php
Check.php
参看:http://hi.baidu.com/studyphp/blog/item/055eda62b6bbe0d8e6113a4b.html
<?php
$keys= "123,234,456";
define("URL","10.69.3.23:8199/?class=0&keys=%s");
$txt = sprintf(URL, urlencode($keys));
echo $txt;
?>
$keys= "123,234,456";
define("URL","10.69.3.23:8199/?class=0&keys=%s");
$txt = sprintf(URL, urlencode($keys));
echo $txt;
?>
配置文件分离:
define.php
define('BLOGBINDURL',"http://o.xianguo.com/sina/blogbind?email=%s&puid=%s&blogUrl=%s&action=%s&api
key=%s&time=%s&securitykey=%s");
key=%s&time=%s&securitykey=%s");
ZZZ.php
public function bindblog($email,$uid,$blogurl,$action)
{
$time = time();
$securitykey = md5($uid . BIND_BLOG_APIKEY . $time . BIND_BLOG_PRIKEY);
$url = sprintf(BLOGBINDURL, urlencode($email), urlencode($uid), urlencode("http://".
$blogurl), urlencode($action), BIND_BLOG_APIKEY, urlencode($time), urlencode($securitykey));
$flag = Check::request($url,$result);
if(1 == $flag) {
$resultReturn = json_decode($result,true);
if(0 === $resultReturn['status'])
return 1;
if(1 === $resultReturn['status'])
return 0;
} else {
return 0;
}
}
{
$time = time();
$securitykey = md5($uid . BIND_BLOG_APIKEY . $time . BIND_BLOG_PRIKEY);
$url = sprintf(BLOGBINDURL, urlencode($email), urlencode($uid), urlencode("http://".
$blogurl), urlencode($action), BIND_BLOG_APIKEY, urlencode($time), urlencode($securitykey));
$flag = Check::request($url,$result);
if(1 == $flag) {
$resultReturn = json_decode($result,true);
if(0 === $resultReturn['status'])
return 1;
if(1 === $resultReturn['status'])
return 0;
} else {
return 0;
}
}
Check.php
static public function request($url,&$result,$timeout=10) {
$ctx = stream_context_create(array(
'http' => array(
'timeout' =>$timeout
)
));
$result = file_get_contents($url,false,$ctx);
if ($result === false) {
error_log("request $url timeout",0);
return 0;
}
return 1;
}
$ctx = stream_context_create(array(
'http' => array(
'timeout' =>$timeout
)
));
$result = file_get_contents($url,false,$ctx);
if ($result === false) {
error_log("request $url timeout",0);
return 0;
}
return 1;
}
参看:http://hi.baidu.com/studyphp/blog/item/055eda62b6bbe0d8e6113a4b.html
一维数组直接用点即可:
显示HTML:
三维数组形式:
Html用Smarty循环出来如下:
public function GetFriendScoreOrder(&$result,$uid)
{
$json_array = '{"1548940117":"157829","1584778420":"7842","1052833673":"442222"}';
$json2array = json_decode($json_array,TRUE);
print_r($json2array);
arsort($json2array);
print_r($json2array);
//var_dump($json2array);
$uids = array_flip($json2array);
$return = Person::getRealNames(&$resultname,$uids);
$i = 0;
foreach($resultname as $k =>$v)
{
$arraydisplay[$i][name] = $v;
$arraydisplay[$i][uid] = $k;
$arraydisplay[$i][score] = $json2array[$k];
$i++;
}
$result = $arraydisplay;
{
$json_array = '{"1548940117":"157829","1584778420":"7842","1052833673":"442222"}';
$json2array = json_decode($json_array,TRUE);
print_r($json2array);
arsort($json2array);
print_r($json2array);
//var_dump($json2array);
$uids = array_flip($json2array);
$return = Person::getRealNames(&$resultname,$uids);
$i = 0;
foreach($resultname as $k =>$v)
{
$arraydisplay[$i][name] = $v;
$arraydisplay[$i][uid] = $k;
$arraydisplay[$i][score] = $json2array[$k];
$i++;
}
$result = $arraydisplay;
膘叔(19129540) 15:42:02
usort
莫莫(3296320) 15:42:32
对
莫莫(3296320) 15:42:38
用usort很简单
膘叔(19129540) 15:44:59
usort直接有例子的。
近半年的工作心得,摘录如下:
( 2月 20 日-- 2月 26 日)
工作心得
一.Ajax通过POST提交给$_POST数组变量问题:
和js人员一块调试ajax提交一些数据的时候,在ajax调用的时候,js人员通过Post方式传给我一个'allowComment',它为True\false,刚开始误以为是一个TRUE 或 FALSE是PHP里面的一个布尔值(实际是一个字符串),于是写下如下代码片段:
if(true == $_POST['allowComment'])
{
$this->_par['allow_comment'] = 0;//0为允许评论
}else
{
$this->_par['allow_comment'] = 1;
}
导致出现无论post过来的数据是true还是false,只走if不走else,当时很奇怪,我通过print_r()来打印看到明明是false,但是还是不走else这条路,最后听建鑫说它是个字符串,我于是改用var_dump()函数来看:var_dump($_POST)发现它其实就是个string类型的字符串:string(4) "ture",不是布尔型的一个变量。而修改为:(引号引起来即可)
if(‘true’ == $_POST['allowComment'])
{
$this->_par['allow_comment'] = 0;//0为允许评论
}else
{
$this->_par['allow_comment'] = 1;
}
结论:尽管PHP是弱类型语言,但我们调试时候最好用var_dump(),而不是print_r();
二.DIV模板取高度自动适应的问题:
在做这次记录套页面的时候,提供的页面是一整张页面,这就需要php工程师去去掉里面的一些没有用的DIV标签和多余的html代码,但是在把最后剩下的一些HTML代码套好页面后,在放到pengyou里面测试时候,发现页面被遮挡,最后发现是由于刘嵩Js想取到一个DIV的高度没有得到正确的值,而这正是由于HTML设计人员把一整张页面让PHP开发人员去从里面提取出需要的东西,但是往往会出现某些DIV没有带到Smarty页面里渲染,才导致js在通过ID或者NAME去取高度时候出错,也就是PHP工程师套页面的时候并不知道UI提供的页面中哪些DIV是JS人员必须要的,而UI人员就把整个页面给PHP工程师自己去剔掉多余的DIV和HTML,而刚好把JS需要的DIV给干掉了造成的.
结论:切页面得按照产品结构来,而不是仅仅UE,涉及到JS的得事先和PHP工程师和JS人员沟通。
三.接口变动问题:
一些底层接口的变动往往造成输入(入数据库)和输出(如:页面)出现一些明显的逻辑错误,于是我们首先会想可能是不是程序逻辑出现了问题,进一步去查程序代码的逻辑是否严密,会发现数据库里面出现一些和现实逻辑不同的情况,而很容易把陈脚搞乱,特别是有其它系统的介入,更让人很难发现其中错误。
结论:尽量少动接口返回的数据结构,保持结口稳定,而一旦改变,及时通知接口使用和开发方。
( 3月 6 日-- 3月 12 日)
工作心得
对重构的一点体会:
1.改进软件的结构:
在开发记录的时候有时由于一个新的需求导致为了更快的满足用户,不故到程序的整体结构,而这种解决方法不能以一个系统的角度来解决问题,如果任其发展会使代码的质量越来越难以维护,而重构能改善这个问题。
2.增加可读性:
以前的记录的数据层是由外包人员写的,让我觉得有点难懂,而有人说,修改别人的代码不如自己写,但事实上往往自己写的代码比上一个人还难以让别的人读懂,但是如果这个人有一天离职或者没有上班那就有些耗费时间去读懂对方的代码,而我们的重构可以通过一些命名规范和类的规范和层次结构的规范来尽量防止这类事情的发生,仅管我也参考了他们的代码。
3.及早地发现错误:
进行重构我们必须对项目的每一行代码的逻辑都了解,明确它的功能和上下程序调用关系,这样的理解我觉得有助于少犯错误和及时发现自己的错误。
4.提高了开发速度:
知道用户80%的需求的情况下,这种情况下重构,可能从一定程度上能提高开发速度。
( 3月 13 日-- 3月 19 日)
遇到一问题
在对记录的项目中进行重构的时候发现需要通过Ajax多提交一个POST变量到PHP那边去,发现不能随意加,而和js开发人员沟通了一下,结果是必须得修改一下js代码,把多提交的一个加进去才行,但是我个人觉得js的Ajax Post应该做得像表单提交数据那样,只要多加一个<input type=text id=”XXX” name=”XXX” value=”add_value”>数据加入<form></form>就可以对它POST提交到另一个PHP文件,而不是仅仅对一个单独的应用而写一个Ajax Post提交数据 ,不知能否改进成这样?
工作心得
1.
做项目最好先了解需求,然后明确需求,再思考用例,然后画数据流,最后才是数据库的设计,当然最后的数据库设计也是最重要的!
2.
对于一些定义分级和对应级别的少量数据最好放到PHP数组里面,而尽量不要放到数据库里,而对一些不是经常改动而却又是经常频繁查询用到的数据在量不是很在的情况下如放到数据库里面会显得成本太高,放到一个文本里变为一个配置文件来用效率可能会反而更高。
3.
对大并发和高访问的数据库设计解决方法现目前还是分表,如还不行,再Hash打散分库,但不能无限分,一个库尽量256表,动用4个库来也就分了1000个表左右,建鑫的经验告诉这样可能性能和稳定性相对高一些,而不能随意乱分。不知按时间或者天数来分表这种情况会有什么样的问题,期待通过人缘项目来尝试一下。
2009-03-20 ----2009-03-26:
遇到一问题
工作心得
对于上次邮件里面讨论到的PHP BOM问题,我来说来句就当心得吧,其实这个BOM问题一直在我们进行开发的时候经常出现,前些日子在企业邮箱里面第一次遇到这个问题,当时好像是企业的图标LOGO没有办法显示出来,因为<img src="img.php">,是img.php去读一个图片的内容然后给img显示,经过长仔细排查出现在输出图片资源前就有输出,那时候用的是notepad+editplus,最后用Zend studio来看这个文件头出现一个锘�字,证明了该问题。
第二次遇到BOM问题,是陈鑫鑫在纸条项目里面输出XML数据到IE浏览器中展现出现XML错误。
第三次也就是我们的记录APP调用外部接口返回用户的昵称出现乱码,经琳琳查也由BOM造成!
为何经常出现这种类似的问题,我看大家都在按照自己的方式来建立和开发PHP,特别是用Notepad来新建文件,系统默认在是ANSI格式,但我们的PHP编码是UTF-8的,于是又通过Notepad的另存为修改为UTF-8格式的,这样也就产生了一个BOM,最后,再用现在统一的开发工具Zend for eclipse去编辑这个带BOM的PHP文件,但BOM依然存在文件当中,它一般是表现不出任何问题,但一旦在页面前不能有输出的情况:如上面我遇到的三种情况它也就显现出来了。
BOM如此讨厌,该如何避免:
建议:
1. 切实统一开发工具:统一用Zend for eclipse 来新建PHP文件,和修改PHP文件编码!
2. 在项目完成后对目录里面所有的PHP 文件进行遍历驱出有可能出现的BOM。如:用sed批量替换掉bom:(syscore目录和所有下级目录的PHP文件替换) find ./syscore -type f -name "*.php" -exec sed -i '1s/^\xef\xbb\xbf//' {} \;
(3月27日---4月2日)
遇到一问题:
在调试记录的js时发现超过了页数却没有出现翻页导航的页,开始首先以为是数据没有输出程序的问题, 最后查明是由于朋友下面的frame把下面给档住了,Js人员修正了这个问题,这个问题还经常出现,希望js人员也多注意一下!
工作心得:
本周收到老姜发的一点对PHP框架的看法,我也斗胆也说说我自己对这个问题的看法,有些可能说得不太准确或者有些错误,还望包含:
首先,我个人是不反对PHP采用一些轻量级的框架,但极力反对对PHP用一些重型的框架的,为什么呢?因为它的执行方式决定了它的这个特点:php每一个脚本先全部载入所有资源,执行完毕后全部放弃,所以使用太重的框架,会极耗内存和计算资源,形成调用栈太深占用系统资源,个人觉得轻量框架和简单的分层还是一定要采用的。
其次,你会说像Java这样的语言它能采用一些的框架,而且还涌现出了一些红红火火的框架了呢:)
个人觉得那是因为java的执行方式和PHP不一样,对于内存管理也不一样,有很多都是一次装入内存,直到jvm重启才被释放的, 事务性,安全性等等很多基础性的服务,都需要预先装入,何况java是基于工业级应用产生的,php只是个人网站开发才出现的,能一样吗?不能。所以,不能我们也不要一边倒,看人家采用什么什么了,自己也想把PHP往边上套。
再次,C++和Java强悍的框架不少,但惨不忍睹的框架也更多,为什么呢?用一个越是尖端的东西越不容易用好,对于重型的编程语言对软件工程功底的要求是相当高的,不是谁说想做个框架就做个框架,更何况各个项目的千差万别,实际的情况也不尽一样,更不能以一个框架来以逸待劳,放大了框架的作用,它并不是万能的。
最后,我仅对PHP的框架也就领悟到:轻量框架和简单的分层还是PHP在大多数项目开发中还是一定要采用的,但切忌过重,把握好度,适可而止。
(4-10----4-16)
1.我们人缘项目需要对用户分数排序(降序)用户姓名(升序)排序,我们用了array_multisort函数来干这件事情:
[code]$data = array(‘待排数据’);
foreach ($data as $key => $row)
{
$score[$key] = $row['score'];
$name[$key] = $row['name'];
} [/code]
array_multisort($score, SORT_DESC, $name, SORT_ASC, $data);
然而在实际排序中发生了和预期的不相符,最后经过排查发现:
Space框架对展现层和数据输出为utf8编码,而中间没有展现和过渡层则是GBK编码,而我们的人缘项目需要在Modle层的PHP文件是GBK编码时候对输出姓名进行排序,而我们在Modle层调用姓名接口返回是utf8编码返回,而我们的Modle层文件是gbk的编码,这就导致一个问题,我们在用array_multisort对姓名排序时候发现排除来的中文顺序不对,而自己做实验出来的结果是正确的时因为我们的代码都是GBK的,发现是由于文件编码和接口输出编码不一致导致的,为了解决该问题,我们先将接口返回的UTF8的编码进行转GBK码,而后通过array_multisort排完顺序后再转回来,这样一个过程多少感觉有些怪异!
2.space编码中有UTF8和GBK在各个层次中不同有什么特别的好处吗?这样做对与问题1来说比较奇怪!
(4-24---4-30)
心得体会:
我就谈谈今天上午讲记录整体架构过程中个人的一些体会吧,我开始觉得要讲清楚记录这个APP的整体架构似乎很简单,但是在短时间准备过程中发现真要讲解清楚我们的记录的各个情况真不知道从如何下手,发现要讲清楚记录这个项目让听众能从不明白到了解还真需要一些技巧和经验的积累,还好在计算机软件领域早以有UML建模等相关的知识来描述相关的事情,已经形成一门专门的知识体系,站在前人的肩膀上可能更能少走弯路,但我也是第一次讲解,经验缺乏,但凡万事开头难,还好在建鑫的指点帮助下,以及以前我也参加了前段时间的项目评审会的耳濡目染,感悟评审团在评审的时候其实对于如何编写程序如何具体实现某个功能并不是很太在意,而是在意的那几张图(用例图,流程图,数据流图)和设计的可行性罢了,而其实这写图已经帮我们从不同的角度和视野来看这个软件体系给予有层次性和逻辑性的展现出来了,最后,再加上数据库的整体设计(索引大致情况)和程序分层目录结构的部署等,如果讲得很有条理和逻辑清楚那这个系统基本上已经可以付诸编码实施开发了,但是我的这次讲解刚好相反,是设计好了,然后我再去讲解,离真去从无到有还很有差距,但这也是对自己的一次很好的锻炼,还是有所提高和得到一些收获,同时也非常感谢建鑫给我这次讲解整体架构的机会,谢谢。
向东( 5月 1 日-- 5月 7 日)的周报
遇到一问题:
今天调试博客绑定发送feed需要对其标题和内容作关键字过滤,发现Pengyou的过滤程序对我提供的高敏感的词返回值有误同时也没有给过滤掉,进过查看对应的Pengyou 的svn过滤的代码几经多个人改动那个过滤函数进而改动引出新Bug,同时发现space的过滤函数和app的过滤函数写得何其相似,功能几乎相近:都是对高敏感返回0,直接传地址返回空字串;低敏感返回2,把里面的敏感词替换为***;然后传地址返回整个内容;在没有任何敏感的情况return 1,返回正常的字符串,这样的过滤代码在APP的公共代码lib库里面也有一份,代码大致一样,我在想这两个几乎一样的需求和流程能否封装为一个公共的关键字过滤的服,抽离出来对不同的应用相似的逻辑进而选一个服务,把关键词基础库和各个业务的特殊字库都做在服务里面,低耦合,高内聚的形式来提供整个关键字过滤服务,这样做理论上可能会更让人容易理解和便于调用和bug的排查,同时维护成本也相对小一些,个人建议,仅供参考。
( 05月08 日 -- 05月 14日)
心得体会:
对于本周上线后测试出的一个Bug的界定很难,很多在测试机上测试正常,但是上线后就往往发生很多意想不到的问题,测试往往发生很多测试环境没有发生的问题进而提出Bug,而一个项目是由若干个子项目构成的,子项目相互调用接口进而完成一个服务,而数据就在这个接口之间流动,而接口的规范和到底是哪个接口出现的问题界定往往在外网真实环境在缺乏权限的情况下测试人员测试出来的Bug最难以界定是哪一个环节出了问题,而各个小组也很难上线上去调试查询,觉得这里面可能要是需要提供一些日志来记录各个接口的数据传输状况类似于PHPUNIT的日志系统,单独出来一台机器和外网并行任意包含外网某个代码片段(接口),进而做成一个线上日志系统,可供线下进行分析,或者线上提供一个功能强大的日志函数,在线下很难查到问题的情况下进行把数据接口的数据输入并能以很低的权限让查找Bug的人员观察,进而做出准确定位和界定Bug,做出及时的判断,进而分发Bug给相关人等去查证,而由于这个系统是按照一定的结构构成而分给的相关人可以很轻易看到他的接口出现什么问题,进而跟踪问题所在,毕竟模拟真实生产环境如果缺少一个很好的架构体系来支撑整个业务流程而不是仅仅有经验的技术人员来估计问题所在而后分发提案让相关人员在去合围Bug,但这里面缺乏Bug的定位(由于在线上:很可能线下正常,线上的环境出现异常等情况,查找较为困难)的高效方法这样的沟通估计效率可能不是太高,但不得不佩服经验对于Bug的定位确实起到了相当大的作用。
如要转载:请标明出处,谢谢! 向东 (2009-5-7)
关于json里怎么传bool类型,csdn有一篇文章:
ajax中使用json传递数据时,其它数据类型都不是问题,但是如果服务器端生成的JSON中有bool类型的数据时,到客户端解析时出现了小小的问题,总结如下:
服务器返回的JSON为:
{"TypeID":[1037],"Title":"河北软件职业技术学院","Intro":"","IsLink":"false","LinkUrl":"http://www.hbsi.edu.cn","IsPic":"true","Picture":"/newsimages/hbsi.jpg","Content":"<p><br></p>"}
其中属性:IsLink和IsPic都是bool类型,在客户端使用方法:
document.getElementById("checkbox1").checked = news.IsLink;会选中复选框,但是IsLInk为false,本不应该选中,为什么呢?
查其原因,javascript 有三种基本数据类型(字符串string、数值number、布尔boolean ),两种引用数据类型(对象Object、数组Array)和两种特殊数据类型(Null 、Undefined )。其它类型向bool类型转换时的有如下原则:
数据类型 转换为bool后的值 null FALSE undefined FALSE Object TRUE function TRUE 0 FALSE 1 TRUE 0、1之外的数字 TRUE 字符串 TRUE ""(空字符串) FALSE
此时,IsLink在JSON中为字符串“false”,所以转换后得到bool类型true。
处理办法:
document.getElementById("checkbox1").checked = news.IsLink==“true";
( 2月 20 日-- 2月 26 日)
工作心得
一.Ajax通过POST提交给$_POST数组变量问题:
和js人员一块调试ajax提交一些数据的时候,在ajax调用的时候,js人员通过Post方式传给我一个'allowComment',它为True\false,刚开始误以为是一个TRUE 或 FALSE是PHP里面的一个布尔值(实际是一个字符串),于是写下如下代码片段:
if(true == $_POST['allowComment'])
{
$this->_par['allow_comment'] = 0;//0为允许评论
}else
{
$this->_par['allow_comment'] = 1;
}
导致出现无论post过来的数据是true还是false,只走if不走else,当时很奇怪,我通过print_r()来打印看到明明是false,但是还是不走else这条路,最后听建鑫说它是个字符串,我于是改用var_dump()函数来看:var_dump($_POST)发现它其实就是个string类型的字符串:string(4) "ture",不是布尔型的一个变量。而修改为:(引号引起来即可)
if(‘true’ == $_POST['allowComment'])
{
$this->_par['allow_comment'] = 0;//0为允许评论
}else
{
$this->_par['allow_comment'] = 1;
}
结论:尽管PHP是弱类型语言,但我们调试时候最好用var_dump(),而不是print_r();
二.DIV模板取高度自动适应的问题:
在做这次记录套页面的时候,提供的页面是一整张页面,这就需要php工程师去去掉里面的一些没有用的DIV标签和多余的html代码,但是在把最后剩下的一些HTML代码套好页面后,在放到pengyou里面测试时候,发现页面被遮挡,最后发现是由于刘嵩Js想取到一个DIV的高度没有得到正确的值,而这正是由于HTML设计人员把一整张页面让PHP开发人员去从里面提取出需要的东西,但是往往会出现某些DIV没有带到Smarty页面里渲染,才导致js在通过ID或者NAME去取高度时候出错,也就是PHP工程师套页面的时候并不知道UI提供的页面中哪些DIV是JS人员必须要的,而UI人员就把整个页面给PHP工程师自己去剔掉多余的DIV和HTML,而刚好把JS需要的DIV给干掉了造成的.
结论:切页面得按照产品结构来,而不是仅仅UE,涉及到JS的得事先和PHP工程师和JS人员沟通。
三.接口变动问题:
一些底层接口的变动往往造成输入(入数据库)和输出(如:页面)出现一些明显的逻辑错误,于是我们首先会想可能是不是程序逻辑出现了问题,进一步去查程序代码的逻辑是否严密,会发现数据库里面出现一些和现实逻辑不同的情况,而很容易把陈脚搞乱,特别是有其它系统的介入,更让人很难发现其中错误。
结论:尽量少动接口返回的数据结构,保持结口稳定,而一旦改变,及时通知接口使用和开发方。
( 3月 6 日-- 3月 12 日)
工作心得
对重构的一点体会:
1.改进软件的结构:
在开发记录的时候有时由于一个新的需求导致为了更快的满足用户,不故到程序的整体结构,而这种解决方法不能以一个系统的角度来解决问题,如果任其发展会使代码的质量越来越难以维护,而重构能改善这个问题。
2.增加可读性:
以前的记录的数据层是由外包人员写的,让我觉得有点难懂,而有人说,修改别人的代码不如自己写,但事实上往往自己写的代码比上一个人还难以让别的人读懂,但是如果这个人有一天离职或者没有上班那就有些耗费时间去读懂对方的代码,而我们的重构可以通过一些命名规范和类的规范和层次结构的规范来尽量防止这类事情的发生,仅管我也参考了他们的代码。
3.及早地发现错误:
进行重构我们必须对项目的每一行代码的逻辑都了解,明确它的功能和上下程序调用关系,这样的理解我觉得有助于少犯错误和及时发现自己的错误。
4.提高了开发速度:
知道用户80%的需求的情况下,这种情况下重构,可能从一定程度上能提高开发速度。
( 3月 13 日-- 3月 19 日)
遇到一问题
在对记录的项目中进行重构的时候发现需要通过Ajax多提交一个POST变量到PHP那边去,发现不能随意加,而和js开发人员沟通了一下,结果是必须得修改一下js代码,把多提交的一个加进去才行,但是我个人觉得js的Ajax Post应该做得像表单提交数据那样,只要多加一个<input type=text id=”XXX” name=”XXX” value=”add_value”>数据加入<form></form>就可以对它POST提交到另一个PHP文件,而不是仅仅对一个单独的应用而写一个Ajax Post提交数据 ,不知能否改进成这样?
工作心得
1.
做项目最好先了解需求,然后明确需求,再思考用例,然后画数据流,最后才是数据库的设计,当然最后的数据库设计也是最重要的!
2.
对于一些定义分级和对应级别的少量数据最好放到PHP数组里面,而尽量不要放到数据库里,而对一些不是经常改动而却又是经常频繁查询用到的数据在量不是很在的情况下如放到数据库里面会显得成本太高,放到一个文本里变为一个配置文件来用效率可能会反而更高。
3.
对大并发和高访问的数据库设计解决方法现目前还是分表,如还不行,再Hash打散分库,但不能无限分,一个库尽量256表,动用4个库来也就分了1000个表左右,建鑫的经验告诉这样可能性能和稳定性相对高一些,而不能随意乱分。不知按时间或者天数来分表这种情况会有什么样的问题,期待通过人缘项目来尝试一下。
2009-03-20 ----2009-03-26:
遇到一问题
工作心得
对于上次邮件里面讨论到的PHP BOM问题,我来说来句就当心得吧,其实这个BOM问题一直在我们进行开发的时候经常出现,前些日子在企业邮箱里面第一次遇到这个问题,当时好像是企业的图标LOGO没有办法显示出来,因为<img src="img.php">,是img.php去读一个图片的内容然后给img显示,经过长仔细排查出现在输出图片资源前就有输出,那时候用的是notepad+editplus,最后用Zend studio来看这个文件头出现一个锘�字,证明了该问题。
第二次遇到BOM问题,是陈鑫鑫在纸条项目里面输出XML数据到IE浏览器中展现出现XML错误。
第三次也就是我们的记录APP调用外部接口返回用户的昵称出现乱码,经琳琳查也由BOM造成!
为何经常出现这种类似的问题,我看大家都在按照自己的方式来建立和开发PHP,特别是用Notepad来新建文件,系统默认在是ANSI格式,但我们的PHP编码是UTF-8的,于是又通过Notepad的另存为修改为UTF-8格式的,这样也就产生了一个BOM,最后,再用现在统一的开发工具Zend for eclipse去编辑这个带BOM的PHP文件,但BOM依然存在文件当中,它一般是表现不出任何问题,但一旦在页面前不能有输出的情况:如上面我遇到的三种情况它也就显现出来了。
BOM如此讨厌,该如何避免:
建议:
1. 切实统一开发工具:统一用Zend for eclipse 来新建PHP文件,和修改PHP文件编码!
2. 在项目完成后对目录里面所有的PHP 文件进行遍历驱出有可能出现的BOM。如:用sed批量替换掉bom:(syscore目录和所有下级目录的PHP文件替换) find ./syscore -type f -name "*.php" -exec sed -i '1s/^\xef\xbb\xbf//' {} \;
(3月27日---4月2日)
遇到一问题:
在调试记录的js时发现超过了页数却没有出现翻页导航的页,开始首先以为是数据没有输出程序的问题, 最后查明是由于朋友下面的frame把下面给档住了,Js人员修正了这个问题,这个问题还经常出现,希望js人员也多注意一下!
工作心得:
本周收到老姜发的一点对PHP框架的看法,我也斗胆也说说我自己对这个问题的看法,有些可能说得不太准确或者有些错误,还望包含:
首先,我个人是不反对PHP采用一些轻量级的框架,但极力反对对PHP用一些重型的框架的,为什么呢?因为它的执行方式决定了它的这个特点:php每一个脚本先全部载入所有资源,执行完毕后全部放弃,所以使用太重的框架,会极耗内存和计算资源,形成调用栈太深占用系统资源,个人觉得轻量框架和简单的分层还是一定要采用的。
其次,你会说像Java这样的语言它能采用一些的框架,而且还涌现出了一些红红火火的框架了呢:)
个人觉得那是因为java的执行方式和PHP不一样,对于内存管理也不一样,有很多都是一次装入内存,直到jvm重启才被释放的, 事务性,安全性等等很多基础性的服务,都需要预先装入,何况java是基于工业级应用产生的,php只是个人网站开发才出现的,能一样吗?不能。所以,不能我们也不要一边倒,看人家采用什么什么了,自己也想把PHP往边上套。
再次,C++和Java强悍的框架不少,但惨不忍睹的框架也更多,为什么呢?用一个越是尖端的东西越不容易用好,对于重型的编程语言对软件工程功底的要求是相当高的,不是谁说想做个框架就做个框架,更何况各个项目的千差万别,实际的情况也不尽一样,更不能以一个框架来以逸待劳,放大了框架的作用,它并不是万能的。
最后,我仅对PHP的框架也就领悟到:轻量框架和简单的分层还是PHP在大多数项目开发中还是一定要采用的,但切忌过重,把握好度,适可而止。
(4-10----4-16)
1.我们人缘项目需要对用户分数排序(降序)用户姓名(升序)排序,我们用了array_multisort函数来干这件事情:
[code]$data = array(‘待排数据’);
foreach ($data as $key => $row)
{
$score[$key] = $row['score'];
$name[$key] = $row['name'];
} [/code]
array_multisort($score, SORT_DESC, $name, SORT_ASC, $data);
然而在实际排序中发生了和预期的不相符,最后经过排查发现:
Space框架对展现层和数据输出为utf8编码,而中间没有展现和过渡层则是GBK编码,而我们的人缘项目需要在Modle层的PHP文件是GBK编码时候对输出姓名进行排序,而我们在Modle层调用姓名接口返回是utf8编码返回,而我们的Modle层文件是gbk的编码,这就导致一个问题,我们在用array_multisort对姓名排序时候发现排除来的中文顺序不对,而自己做实验出来的结果是正确的时因为我们的代码都是GBK的,发现是由于文件编码和接口输出编码不一致导致的,为了解决该问题,我们先将接口返回的UTF8的编码进行转GBK码,而后通过array_multisort排完顺序后再转回来,这样一个过程多少感觉有些怪异!
2.space编码中有UTF8和GBK在各个层次中不同有什么特别的好处吗?这样做对与问题1来说比较奇怪!
(4-24---4-30)
心得体会:
我就谈谈今天上午讲记录整体架构过程中个人的一些体会吧,我开始觉得要讲清楚记录这个APP的整体架构似乎很简单,但是在短时间准备过程中发现真要讲解清楚我们的记录的各个情况真不知道从如何下手,发现要讲清楚记录这个项目让听众能从不明白到了解还真需要一些技巧和经验的积累,还好在计算机软件领域早以有UML建模等相关的知识来描述相关的事情,已经形成一门专门的知识体系,站在前人的肩膀上可能更能少走弯路,但我也是第一次讲解,经验缺乏,但凡万事开头难,还好在建鑫的指点帮助下,以及以前我也参加了前段时间的项目评审会的耳濡目染,感悟评审团在评审的时候其实对于如何编写程序如何具体实现某个功能并不是很太在意,而是在意的那几张图(用例图,流程图,数据流图)和设计的可行性罢了,而其实这写图已经帮我们从不同的角度和视野来看这个软件体系给予有层次性和逻辑性的展现出来了,最后,再加上数据库的整体设计(索引大致情况)和程序分层目录结构的部署等,如果讲得很有条理和逻辑清楚那这个系统基本上已经可以付诸编码实施开发了,但是我的这次讲解刚好相反,是设计好了,然后我再去讲解,离真去从无到有还很有差距,但这也是对自己的一次很好的锻炼,还是有所提高和得到一些收获,同时也非常感谢建鑫给我这次讲解整体架构的机会,谢谢。
向东( 5月 1 日-- 5月 7 日)的周报
遇到一问题:
今天调试博客绑定发送feed需要对其标题和内容作关键字过滤,发现Pengyou的过滤程序对我提供的高敏感的词返回值有误同时也没有给过滤掉,进过查看对应的Pengyou 的svn过滤的代码几经多个人改动那个过滤函数进而改动引出新Bug,同时发现space的过滤函数和app的过滤函数写得何其相似,功能几乎相近:都是对高敏感返回0,直接传地址返回空字串;低敏感返回2,把里面的敏感词替换为***;然后传地址返回整个内容;在没有任何敏感的情况return 1,返回正常的字符串,这样的过滤代码在APP的公共代码lib库里面也有一份,代码大致一样,我在想这两个几乎一样的需求和流程能否封装为一个公共的关键字过滤的服,抽离出来对不同的应用相似的逻辑进而选一个服务,把关键词基础库和各个业务的特殊字库都做在服务里面,低耦合,高内聚的形式来提供整个关键字过滤服务,这样做理论上可能会更让人容易理解和便于调用和bug的排查,同时维护成本也相对小一些,个人建议,仅供参考。
( 05月08 日 -- 05月 14日)
心得体会:
对于本周上线后测试出的一个Bug的界定很难,很多在测试机上测试正常,但是上线后就往往发生很多意想不到的问题,测试往往发生很多测试环境没有发生的问题进而提出Bug,而一个项目是由若干个子项目构成的,子项目相互调用接口进而完成一个服务,而数据就在这个接口之间流动,而接口的规范和到底是哪个接口出现的问题界定往往在外网真实环境在缺乏权限的情况下测试人员测试出来的Bug最难以界定是哪一个环节出了问题,而各个小组也很难上线上去调试查询,觉得这里面可能要是需要提供一些日志来记录各个接口的数据传输状况类似于PHPUNIT的日志系统,单独出来一台机器和外网并行任意包含外网某个代码片段(接口),进而做成一个线上日志系统,可供线下进行分析,或者线上提供一个功能强大的日志函数,在线下很难查到问题的情况下进行把数据接口的数据输入并能以很低的权限让查找Bug的人员观察,进而做出准确定位和界定Bug,做出及时的判断,进而分发Bug给相关人等去查证,而由于这个系统是按照一定的结构构成而分给的相关人可以很轻易看到他的接口出现什么问题,进而跟踪问题所在,毕竟模拟真实生产环境如果缺少一个很好的架构体系来支撑整个业务流程而不是仅仅有经验的技术人员来估计问题所在而后分发提案让相关人员在去合围Bug,但这里面缺乏Bug的定位(由于在线上:很可能线下正常,线上的环境出现异常等情况,查找较为困难)的高效方法这样的沟通估计效率可能不是太高,但不得不佩服经验对于Bug的定位确实起到了相当大的作用。
如要转载:请标明出处,谢谢! 向东 (2009-5-7)
关于json里怎么传bool类型,csdn有一篇文章:
ajax中使用json传递数据时,其它数据类型都不是问题,但是如果服务器端生成的JSON中有bool类型的数据时,到客户端解析时出现了小小的问题,总结如下:
服务器返回的JSON为:
{"TypeID":[1037],"Title":"河北软件职业技术学院","Intro":"","IsLink":"false","LinkUrl":"http://www.hbsi.edu.cn","IsPic":"true","Picture":"/newsimages/hbsi.jpg","Content":"<p><br></p>"}
其中属性:IsLink和IsPic都是bool类型,在客户端使用方法:
document.getElementById("checkbox1").checked = news.IsLink;会选中复选框,但是IsLInk为false,本不应该选中,为什么呢?
查其原因,javascript 有三种基本数据类型(字符串string、数值number、布尔boolean ),两种引用数据类型(对象Object、数组Array)和两种特殊数据类型(Null 、Undefined )。其它类型向bool类型转换时的有如下原则:
数据类型 转换为bool后的值 null FALSE undefined FALSE Object TRUE function TRUE 0 FALSE 1 TRUE 0、1之外的数字 TRUE 字符串 TRUE ""(空字符串) FALSE
此时,IsLink在JSON中为字符串“false”,所以转换后得到bool类型true。
处理办法:
document.getElementById("checkbox1").checked = news.IsLink==“true";
背景:外包写图片抓取时出现404内容,但就把nginx里的输出给保存在了jpg里,再读取时导致出现:图片没法显示,里面内容是404。
用curl抓取页面时,一般根据curl_exec的返回内容判断是否抓取成功了。但我发现,访问有些站点本来是返回404错误,但页面有内容时,curl把page not found的内容也抓回来了。如果以curl_exec的结果判断是否正确抓取就被误导了。如下面的代码:
查了下手册,发现curl里还有个curl_getinfo函数。应该判断http状态:
新加网上找了一个:
Add Time:2014-01-15
用curl抓取页面时,一般根据curl_exec的返回内容判断是否抓取成功了。但我发现,访问有些站点本来是返回404错误,但页面有内容时,curl把page not found的内容也抓回来了。如果以curl_exec的结果判断是否正确抓取就被误导了。如下面的代码:
$url = 'http://www.cq.xinhuanet.com/house/2008-11/24/content_14996426.htm-';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_ENCODING, "gzip, deflate");
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; CIBA; InfoPath.1; .NET CLR 2.0.50727)");
curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); //自动跟踪location
curl_setopt($ch, CURLOPT_TIMEOUT, 10); //Timeout
curl_setopt($ch, CURLOPT_HEADER, 1);
//curl_setopt($ch, CURLOPT_NOBODY, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec($ch);
curl_close($ch);
if (false == $contents || empty($contents)) {
echo $contents;
} else {
echo “抓取页面失败!”;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_ENCODING, "gzip, deflate");
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; CIBA; InfoPath.1; .NET CLR 2.0.50727)");
curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); //自动跟踪location
curl_setopt($ch, CURLOPT_TIMEOUT, 10); //Timeout
curl_setopt($ch, CURLOPT_HEADER, 1);
//curl_setopt($ch, CURLOPT_NOBODY, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec($ch);
curl_close($ch);
if (false == $contents || empty($contents)) {
echo $contents;
} else {
echo “抓取页面失败!”;
}
查了下手册,发现curl里还有个curl_getinfo函数。应该判断http状态:
$contents = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($http_code >= 400) { //400 - 600都是服务器错误
echo "访问失败!";
exit;
} else {
echo $contents;
}
curl_close($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($http_code >= 400) { //400 - 600都是服务器错误
echo "访问失败!";
exit;
} else {
echo $contents;
}
curl_close($ch);
新加网上找了一个:
Add Time:2014-01-15
http://linuxtoy.org/archives/centos-53.html
http://www.linux23.com/torrent/centos-5-3-i386-bin-1to6-cd:e11c32aaec2ebfe97bea26b043bf4ac6f1fe2200
http://www.srui.cn/soft/11686.htm
据最新linuxworld 消息,Oracle 收购Red hat 进入专利审核阶段,Red hat 董事局原则上已同意被Oracle 收购,oracle 官方发言人表示Oracle 将来可能禁止centos 社区继续发布其centos 产品,centos 社区也表示5.3 有可能是其最后一个合法的版本
颇富戏剧性的结局:致力于商业化的KDE反而失去了重量级商业企业的支持,尽管一些中小规模的Linux企业因技术能力问题将继续支持KDE,但它的商业前途有限。而遵循GPL、完全不以商业化为目的的GNOME反而在该领域大获成功。许多Linux发烧友都不明白为什么优秀的KDE会受到如此待遇,其实道理非常简单—没有哪一家重量级企业喜欢受制于人,也许KDE的Qt不需要很多授权费,但谁知道TrollTech公司以后会不会漫天要价?既然有免费的 GNOME可以选择,那为什么不呢?基于此种理由,RedHat、Novell两家最大的Linux企业和SUN都采用GNOME
http://www.linux23.com/torrent/centos-5-3-i386-bin-1to6-cd:e11c32aaec2ebfe97bea26b043bf4ac6f1fe2200
http://www.srui.cn/soft/11686.htm
据最新linuxworld 消息,Oracle 收购Red hat 进入专利审核阶段,Red hat 董事局原则上已同意被Oracle 收购,oracle 官方发言人表示Oracle 将来可能禁止centos 社区继续发布其centos 产品,centos 社区也表示5.3 有可能是其最后一个合法的版本
颇富戏剧性的结局:致力于商业化的KDE反而失去了重量级商业企业的支持,尽管一些中小规模的Linux企业因技术能力问题将继续支持KDE,但它的商业前途有限。而遵循GPL、完全不以商业化为目的的GNOME反而在该领域大获成功。许多Linux发烧友都不明白为什么优秀的KDE会受到如此待遇,其实道理非常简单—没有哪一家重量级企业喜欢受制于人,也许KDE的Qt不需要很多授权费,但谁知道TrollTech公司以后会不会漫天要价?既然有免费的 GNOME可以选择,那为什么不呢?基于此种理由,RedHat、Novell两家最大的Linux企业和SUN都采用GNOME
插入→引用→索引和目录→目录
即可生成目录
但是你在编辑文档内容的时候要注意定义好章、节、条。
试图→文档结构图,只是个视图,方便生成后的目录和对应内容的删改。
也可修改目录:
在目录上右键,更新域,即可!
即可生成目录
但是你在编辑文档内容的时候要注意定义好章、节、条。
试图→文档结构图,只是个视图,方便生成后的目录和对应内容的删改。
也可修改目录:
在目录上右键,更新域,即可!
1、global属性,建议用对象来读取。
2、获取post或get传递的数据,建议用一个对象来处理,检测时同时需要考虑不同的处理情况。
3、ubb代码存入数据库时要转为标准html代码存入数据库,因为读的几率更高。
4、 对类中的方法,要尽量保证原子性,这样对于单元测试和后期维护都有利。
5、置顶和帖子属性是两个不同的内容,应该用不同的字段表示。也就是存储时尽量不要交叉。
6、继承方式不利于扩展性,组合方式更方便使用。
7、page、pagesize对每个分页程序都是必须的,所以应该把分页的逻辑也并入分页类中。
8、命名规则:需要规范的命名规则。
9、ajax传递时,如果需要html代码,也需要用模版。
10、程序上线前要检查,清理var_dump。
11、对于smarty模版,建议将需要的跳转定义在页头,这样可以对本页可能产生的业务逻辑更清楚。
12、header跳转后需要exit或return,否则后续代码会继续执行。
2、获取post或get传递的数据,建议用一个对象来处理,检测时同时需要考虑不同的处理情况。
3、ubb代码存入数据库时要转为标准html代码存入数据库,因为读的几率更高。
4、 对类中的方法,要尽量保证原子性,这样对于单元测试和后期维护都有利。
5、置顶和帖子属性是两个不同的内容,应该用不同的字段表示。也就是存储时尽量不要交叉。
6、继承方式不利于扩展性,组合方式更方便使用。
7、page、pagesize对每个分页程序都是必须的,所以应该把分页的逻辑也并入分页类中。
8、命名规则:需要规范的命名规则。
9、ajax传递时,如果需要html代码,也需要用模版。
10、程序上线前要检查,清理var_dump。
11、对于smarty模版,建议将需要的跳转定义在页头,这样可以对本页可能产生的业务逻辑更清楚。
12、header跳转后需要exit或return,否则后续代码会继续执行。
<?php
$a = array(
0=>array("uid"=>1,"score"=>22),
1=>array("uid"=>2,"score"=>33),
2=>array("uid"=>3,"score"=>55),
3=>array("uid"=>3,"score"=>55),
7=>array("uid"=>1,"score"=>39),
8=>array("uid"=>2,"score"=>33),
);
foreach($a as $key=> $values)
{
$sum[$values['uid']] += $values['score'];
}
print_r($sum);
?>
$a = array(
0=>array("uid"=>1,"score"=>22),
1=>array("uid"=>2,"score"=>33),
2=>array("uid"=>3,"score"=>55),
3=>array("uid"=>3,"score"=>55),
7=>array("uid"=>1,"score"=>39),
8=>array("uid"=>2,"score"=>33),
);
foreach($a as $key=> $values)
{
$sum[$values['uid']] += $values['score'];
}
print_r($sum);
?>
手册上写着:
Returns the amount of memory, in bytes
round(memory_get_usage()/1024/1024, 2).'MB';
http://www.aicaic.cn/wybc/sort0105/20306_3.html
Returns the amount of memory, in bytes
round(memory_get_usage()/1024/1024, 2).'MB';
http://www.aicaic.cn/wybc/sort0105/20306_3.html
向东(L)xiangdong.org 说:
姜宇:框架这个东西,从设计到使用,都需要相对较高的软件工程功底,也意味着更高的学习
成本……君不见java和.net的框架搞得红红火火,惨不忍睹的程序照样比比皆是。
至于ZF那玩意,呃…就个人而言,我到目前为止,仍然只承认那是一个极富有智慧的代
码包…
另外还有一个,在我个人认知里,框架与PHP的本身特性是存在一点抵触的,这个极点
是效率。所以,针对大型系统就来批评框架,貌似有些以偏概全。
向东(L)xiangdong.org 说:
:D牛不?
加密助手 说:
--- 系统提示: 以下会话未被加密 ---
王哲宾 说:
说得有道理
向东(L)xiangdong.org 说:
ZF那玩意,呃…就个人而言,我到目前为止,仍然只承认那是一个极富有智慧的代
码包
王哲宾 说:
他在哪写得?
向东(L)xiangdong.org 说:
他给我发的邮件。
王哲宾 说:
php确实是不适合于使用重量级的框架
向东(L)xiangdong.org 说:
层次清就OK,我觉得。。
王哲宾 说:
它的执行方式决定了它的这个特点
向东(L)xiangdong.org 说:
执行方式?什么方式
王哲宾 说:
php每一个脚本先全部载入所有资源,执行完毕后全部放弃,所以使用太重的框架,会极耗内存和计算资源
王哲宾 说:
也就是形成调用栈太深的现象
向东(L)xiangdong.org 说:
呵呵,就是经常出站入站。JAVA为何能?
王哲宾 说:
轻量框架和简单的分层还是一定要采用的。
王哲宾 说:
java的执行方式不一样,对于内存管理也不一样,有很多都是一次装入,之道jvm重启才被释放的
王哲宾 说:
完全不一样的执行原理
向东(L)xiangdong.org 说:
嗯,那样做为何还效率低下?
王哲宾 说:
java?
向东(L)xiangdong.org 说:
对呀。
王哲宾 说:
解析速度的问题
向东(L)xiangdong.org 说:
放内存了嘛。。
王哲宾 说:
另外,很多东西需要调入内存
王哲宾 说:
事务性,安全性等等很多基础性的服务,需要预先装入
王哲宾 说:
象php太简单了,压根不考虑这些
向东(L)xiangdong.org 说:
为此它也就快于Java的原因?就是一个简单。
王哲宾 说:
差不多
王哲宾 说:
啥都不考虑,能不快?
向东(L)xiangdong.org 说:
呵呵,也是,PHP 要是做得像java我想它也会慢上来的。
王哲宾 说:
象c也是全都不考虑,比php还快
王哲宾 说:
呵呵
王哲宾 说:
那当然
王哲宾 说:
出发点就不一样
王哲宾 说:
java是基于工业级应用产生的,php只是个人网站开发才出现的
王哲宾 说:
能一样吗
向东(L)xiangdong.org 说:
呵呵,也是。。java
定位和出生就不凡
向东(L)xiangdong.org 说:
我在想搞4年PHP后搞嘛去。。
哈哈。。。
向东(L)xiangdong.org 说:
先搞着,我昨天买了本Linux 下的c++,最近在学gtk.
姜宇:框架这个东西,从设计到使用,都需要相对较高的软件工程功底,也意味着更高的学习
成本……君不见java和.net的框架搞得红红火火,惨不忍睹的程序照样比比皆是。
至于ZF那玩意,呃…就个人而言,我到目前为止,仍然只承认那是一个极富有智慧的代
码包…
另外还有一个,在我个人认知里,框架与PHP的本身特性是存在一点抵触的,这个极点
是效率。所以,针对大型系统就来批评框架,貌似有些以偏概全。
向东(L)xiangdong.org 说:
:D牛不?
加密助手 说:
--- 系统提示: 以下会话未被加密 ---
王哲宾 说:
说得有道理
向东(L)xiangdong.org 说:
ZF那玩意,呃…就个人而言,我到目前为止,仍然只承认那是一个极富有智慧的代
码包
王哲宾 说:
他在哪写得?
向东(L)xiangdong.org 说:
他给我发的邮件。
王哲宾 说:
php确实是不适合于使用重量级的框架
向东(L)xiangdong.org 说:
层次清就OK,我觉得。。
王哲宾 说:
它的执行方式决定了它的这个特点
向东(L)xiangdong.org 说:
执行方式?什么方式
王哲宾 说:
php每一个脚本先全部载入所有资源,执行完毕后全部放弃,所以使用太重的框架,会极耗内存和计算资源
王哲宾 说:
也就是形成调用栈太深的现象
向东(L)xiangdong.org 说:
呵呵,就是经常出站入站。JAVA为何能?
王哲宾 说:
轻量框架和简单的分层还是一定要采用的。
王哲宾 说:
java的执行方式不一样,对于内存管理也不一样,有很多都是一次装入,之道jvm重启才被释放的
王哲宾 说:
完全不一样的执行原理
向东(L)xiangdong.org 说:
嗯,那样做为何还效率低下?
王哲宾 说:
java?
向东(L)xiangdong.org 说:
对呀。
王哲宾 说:
解析速度的问题
向东(L)xiangdong.org 说:
放内存了嘛。。
王哲宾 说:
另外,很多东西需要调入内存
王哲宾 说:
事务性,安全性等等很多基础性的服务,需要预先装入
王哲宾 说:
象php太简单了,压根不考虑这些
向东(L)xiangdong.org 说:
为此它也就快于Java的原因?就是一个简单。
王哲宾 说:
差不多
王哲宾 说:
啥都不考虑,能不快?
向东(L)xiangdong.org 说:
呵呵,也是,PHP 要是做得像java我想它也会慢上来的。
王哲宾 说:
象c也是全都不考虑,比php还快
王哲宾 说:
呵呵
王哲宾 说:
那当然
王哲宾 说:
出发点就不一样
王哲宾 说:
java是基于工业级应用产生的,php只是个人网站开发才出现的
王哲宾 说:
能一样吗
向东(L)xiangdong.org 说:
呵呵,也是。。java
定位和出生就不凡
向东(L)xiangdong.org 说:
我在想搞4年PHP后搞嘛去。。
哈哈。。。
向东(L)xiangdong.org 说:
先搞着,我昨天买了本Linux 下的c++,最近在学gtk.