17MARCH |
|---|
做个视频网站,但并没有使用专门的流媒体服务器,所以要在apache上开个流式媒体输出。
这里的流式媒体输出跟专业的流媒体服务是两回事。这是在apache中添加一个模块,使得以视频流的方式访问,并不需要全部加载完视频后就可以播放。
这里只支持h264编码的mp4后缀。所需要启用的模块为:
mod_h264_streaming
sudo apt-get install apache2-threaded-dev
cd ~
wget http://h264.code-shop.com/download/apache_mod_h264_streaming-2.2.7.tar.gz
tar -zxvf apache_mod_h264_streaming-2.2.7.tar.gz
cd ~/mod_h264_streaming-2.2.7
./configure –with-apxs=`which apxs2`
make
sudo make install
注意:ubuntu 的apxs2 位于 /usr/bin/apxs2
LoadModule h264_streaming_module /usr/lib/apache2/modules/mod_h264_streaming.so
AddHandler h264-streaming.extensions .mp4
sudo /etc/init.d/apache2 restart
由于有些缩略图的文件名中包含”.mp4.”这样的部分,路径中出现这样的部分同样会被该模块捕获,但又处理不了,所以会报错。为此我们专门修改了文件的路径。
11MARCH |
|---|
刚上网搜索了一下,跟这个同名的还有另一个,似乎也挺不错的,这个类库是github.com上的一个开源项目:PHPThumb
它是一个开源的图片缩略图类库,可以完成多种复杂的图片缩略图生成和现实,使用起来非常的方便。
这里有一篇关于其简单实用的说明,英文比较简单,就不翻译了:
这里有一个API列表:
不过非常可惜,API中并没有任何说明,只能对照其英文名称猜测其效果,当然即使猜对了,也要测试下看看是否是正确的。
这里我也写了个简单调用它的方法,不过我是把该图片保存成为文件了,basic-usage中的例子全是直接在页面中输出的:
require\_once 'phpthumb/ThumbLib.inc.php';
try {
$thumb = PhpThumbFactory::create($realpath);
} catch (Exception $e) {
// handle error here however you'd like
}
$thumb->adaptiveResize($width, $height);
$thumb->save($realpath . '.' . $width . 'x' . $height . '.png');
使用过程中,对几个API的理解逐渐加深,这里记录下:
resize ($maxWidth, $maxHeight)
resize方法是最常用的缩略图方法,它直接等比例将最大的边缩小到符合要求的高度/宽度,当图片宽高比与要求不一致时,将会有边显示空白。
adaptiveResize ($width, $height)
adaptiveResize方法是在一些特定情况下,不要求图片的完整,而要求显示特定宽高的最多内容。具体计算方式是:
当图片宽度大于所要求宽度,而高度一致时,取该高度下,从图片左右的中间去所要求的宽度;
当图片的高度大了并且宽度一致时,去该宽度下,图片上下居中位置取得所要求的高度;
当宽高都不正确时,先将图片缩放到所要求大小,再按前两条执行。
save ($fileName, $format = ‘GIF|JPG|PNG’)
当对图片做好处理后,可以用save方法,将图片保存为format中所指示的编码之一,如果未指定编码,将以原编码方式保存。$fileName是要保存的路径。
05MARCH |
|---|
今天又一次遇到PHP 的一个提醒:Notice: Trying to get property of non-object problem,这种错误很常见。上次出错,没查到原因,就简单的以这是一个Notice为由,没有做处理,今天有点时间,就查了查。
我这里实际是调用了一个zend的数据库访问的方法,使用了fetchAll方法,但由于数据库中没有该记录,所以返回的对象是null,所以我就判断对象是否为null:
if($obj==null){
...
}
这么写的结果,就是产生了上面那个notice,也真是奇怪,对象为null,竟然不能访问了?
翻查资料后,发现,判断是否为null,需要这么判断:
if (isset($obj)) {
echo "This var is set set so I will print.";
}
这个isset是做什么的呢?
isset函数是检测变量是否设置。
格式:bool isset ( mixed var [, mixed var [, …]] )
返回值:
若变量不存在则返回 FALSE
若变量存在且其值为NULL,也返回 FALSE
若变量存在且值不为NULL,则返回 TURE
同时检查多个变量时,每个单项都符合上一条要求时才返回 TRUE,否则结果为 FALSE
如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节(”\0”)并不等同于 PHP 的 NULL 常数。
警告: isset() 只能用于变量,因为传递任何其它参数都将造成解析错误。若想检测常量是否已设置,可使用 defined() 函数。
看来刚才我那边的判断所出的问题,就是因为这个“是一个 NULL 字节(”\0”)并不等同于 PHP 的 NULL 常数”。
28DECEMBER |
|---|
转自zendchina,可查看原文,之所以转载,是因为网上的各种资料都不太全,本文很全面。本人在该问题上也遇到很多困难,终于从本文获得启发。希望遇到同样问题的朋友们能尽快解决该问题。同时声明:网传的windows下不能使用zend调试是错的,很难用也是错的,只是不得法而已,不要以讹传讹。我自己尝试的辛苦,希望朋友们能少走些弯路。
下载xdebug,看清版本,很重要,这里使用php_xdebug-2.0.5-5.2.dll,符件中有;
必须以Zend方式加载,见php.ini中配置。配置D:EasyPHPPHPphp.ini,先把optimization注释掉使用”;”
如下:
;[Zend]
;zend_optimizer.optimization_level=1023
;zend_extension_ts=“../Zend/ZendExtensionManager.dll”
;zend_extension_manager.optimizer_ts=“../Zend/Optimizer-3.3.0”
;zend_extension_ts=“D:/EasyPHP/PHP/ext/ZendDebugger.dll”
;zend_debugger.allow_hosts=127.0.0.1⁄32
;zend_debugger.expose_remotely=always
;extension=php_xdebug-2.0.5-5.2.dll
[Xdebug]
zend_extension_ts=D:/EasyPHP/PHP/ext/php_xdebug-2.0.5-5.2.dll
xdebug.profiler_enable=on
xdebug.trace_output_dir=“D:/EasyPHP/xdebug”
xdebug.profiler_output_dir=“D:/EasyPHP/xdebug”
xdebug.remote_enable=On
xdebug.remote_host=“localhost”
xdebug.remote_port=19000
xdebug.remote_handler=“dbgp”
请修改端口为19000防止端口被占用,修改web browse,如下图
不要使用FF会报下面的错误:
waiting for XDebug seession…就不动了,选择IE正常
![]()
然后再按下面配置:
**另外:
**
Zend Studio for Eclipse开启XDebug的方法:
- 6.0.0pluginscom.zend.php_6.0.0.v20080107plugin_customization.ini
将这行org.eclipse.ui.workbench/UIActivities.com.zend.php.debug.ui.XDebugActivity=false
改成true,保存后,重新启动Zend Studio 7,php debug里面就可以选择Xdebug进行调试了。
选择要debugger的web页面
另外WinCacheGrind的使用参考:http://hi.baidu.com/lostdays/blog/item/c2ef51a920c62ff81f17a2f4.html
我的phpinfo信息如下,方便出现问题对比版本:
System
Windows NT WV 5.1 build 2600
Build Date
Nov 8 2007 23:18:08
Configure Command
cscript /nologo configure.js “–enable-snapshot-build” “–with-gd=shared”
Server API
Apache 2.0 Handler
Virtual Directory Support
enabled
Configuration File (php.ini) Path
C:WINDOWS
Loaded Configuration File
D:EasyPHPPHPphp.ini
PHP API
20041225
PHP Extension
20060613
Zend Extension
220060519
Debug Build
no
Thread Safety
enabled
Zend Memory Manager
enabled
IPv6 Support
enabled
Registered PHP Streams
php, file, data, http, ftp, compress.zlib, compress.bzip2, zip
Registered Stream Socket Transports
tcp, udp
Registered Stream Filters
convert.iconv.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, zlib.*, bzip2.*
27DECEMBER |
|---|
@access
使用范围:class,function,var,define,module
该标记用于指明关键字的存取权限:private、public或proteced
@author
指明作者
@copyright
使用范围:class,function,var,define,module,use
指明版权信息
@deprecated
使用范围:class,function,var,define,module,constent,global,include
指明不用或者废弃的关键字
@example
该标记用于解析一段文件内容,并将他们高亮显示。Phpdoc会试图从该标记给的文件路径中读取文件内容
@const
使用范围:define
用来指明php中define的常量
@final
使用范围:class,function,var
指明关键字是一个最终的类、方法、属性,禁止派生、修改。
@filesource
和example类似,只不过该标记将直接读取当前解析的php文件的内容并显示。
@global
指明在此函数中引用的全局变量
@ingore
用于在文档中忽略指定的关键字
@license
相当于html标签中的,首先是URL,接着是要显示的内容
例如百度
可以写作 @license http://www.baidu.com 百度
@link
类似于license
但还可以通过link指到文档中的任何一个关键字
@name
为关键字指定一个别名。
@package
使用范围:页面级别的-> define,function,include
类级别的->class,var,methods
用于逻辑上将一个或几个关键字分到一组。
@abstrcut
说明当前类是一个抽象类
@param
指明一个函数的参数
@return
指明一个方法或函数的返回指
@static
指明关建字是静态的。
@var
指明变量类型
@version
指明版本信息
@todo
指明应该改进或没有实现的地方
@throws
指明此函数可能抛出的错误异常,极其发生的情况
普通的文档标记标记必须在每行的开头以@标记,除此之外,还有一种标记叫做inline tag,用{@}表示,具体包括以下几种:
{@link}
用法同@link
{@source}
显示一段函数或方法的内容
a.注释必须是
/**
* 注释内容
*/
的形式
b.对于引用了全局变量的函数,必须使用glboal标记。
c.对于变量,必须用var标记其类型(int,string,bool…)
d.函数必须通过param和return标记指明其参数和返回值
e.对于出现两次或两次以上的关键字,要通过ingore忽略掉多余的,只保留一个即可
f.调用了其他函数或类的地方,要使用link或其他标记链接到相应的部分,便于文档的阅读。
g.必要的地方使用非文档性注释,提高代码易读性。
h.描述性内容尽量简明扼要,尽可能使用短语而非句子。
i.全局变量,静态变量和常量必须用相应标记说明
<?php
/\*\*
\* Sample File 2, phpDocumentor Quickstart
\*
\* This file demonstrates the rich information that can be included in
\* in-code documentation through DocBlocks and tags.
\* @author Greg Beaver <[email protected]>
\* @version 1.0
\* @package sample
\*/
//PHP code
/\*\*
\* A sample function docblock
\* @global string document the fact that this function uses $\_myvar
\* @staticvar integer $staticvar this is actually what is returned
\* @param string $param1 name to declare
\* @param string $param2 value of the name
\* @return integer
\*/
function firstFunc($param1, $param2 = 'optional') {
static $staticvar = 7;
global $\_myvar;
return $staticvar;
}
22NOVEMBER |
|---|
今天用到了一个新的小功能,是关于headLink和headScript的,对于新手来说需要学习的东西很多啊。经查资料找到用法,这里记录下:
headLink用于对css文件的引用,而headScript用于js脚本文件的引用。可以直接在模板中使用,代码如下:
/application/views/layouts/layout.phtml
headLink()->appendStylesheet($this->baseUrl() . '/css/global.css')
->headLink()->prependStylesheet($this->baseUrl() . '/css/resets.css')
?>
headLink() ?>
也可以在代码中添加,比如这里在Bootstrap.php中进行了添加:
/application/Bootstrap.php (function not complete)
function \_initView()
{
$view->headLink()->prependStylesheet('css/resets.css')
->headLink()->appendStylesheet('css/global.css')
->headLink()->appendStylesheet('css/forms.css')
->headLink()->appendStylesheet('css/pages.css');
}
headScript使用方法一致,不过方法名改了,代码如下:
/application/Bootstrap.php (function not complete)
function \_initView()
{
$view->headScript()->prependFile('js/jquery-1.3.2.min.js')
->headScript()->appendFile('js/jquery-ui-1.7.min.js')
->headScript()->appendFile('js/jquery.easing.1.3.js')
->headScript()->appendFile('js/docready.js');
}
我们举的例子都是在Bootstrap.php中使用的例子,再举个控制器中使用的例子:
public function init ()
{
$this->\_helper->layout()->setLayout("default");
$this->view->headLink()->appendStylesheet('/public/css/commshot.css');
}
这个init是控制器的初始化方法。
20OCTOBER |
|---|
昨日有朋友问及关于facebook 的php sdk的问题,由于之前并没有关注其php sdk,并不是特别的了解,于是专门下载了php sdk来试用,现把学习所得与大家分享。
首先,到facebook的开发者站上下载php的sdk,具体页面在以下地址:
https://developers.facebook.com/docs/reference/php/
这个页面其实是使用文档,讲到了许多使用方法。下载后把下载的压缩包解压缩到站点的目录中即可。
下载的sdk中,有个example.php的文件(具体在example的子文件夹中),这其实就是一个登录并获取用户基本信息的一个演示。另外还有一个结合jssdk的演示,功能一样,效果不一样而已。
演示中提供了默认的appkey和secretkey,但是我只是第一次测试的时候,用它登录成功了,但后来再测试的时候就不能正常使用了,换了我的某一个应用的key,还是不能访问,提示说没有通过url访问的权限之类的说法。不得已,只好创建了一个新的应用,设置url为测试用的域名,还是报一样的错误。
仔细查找后发现,facebook此次升级版本后,增加了好多设置,其中有个url访问的设置默认是关闭的,将其打开即可。具体该选项在高级设置(Advanced)里,叫做Stream post URL security。
我们只分析php sdk的代码,关于jssdk的代码之前曾有文章提到过。
小提示:
使用php sdk,必须打开php_curl.dll,在php.ini中,找到该行,去掉前面的分号,重启apache即可。
首先,引入facebook 的phpsdk,并初始化facebook对象:
require '../src/facebook.php';
// Create our Application instance (replace this with your appId and secret).
$facebook = new Facebook(array(
'appId' => '191149314281714',
'secret' => '73b67bf1c825fa47efae70a46c18906b',
));
初始化中,要把appid后的数字修改为自己申请到的应用的appkey,secret也修改为对应的secretkey,注意secretkey是可变的,如果你觉得你的应用被其他人冒用,可以重新生成该值,但你所有的应用中对应值都要相应的修改。
查看是否有用户已登录:
$user = $facebook->getUser();
// We may or may not have this data based on whether the user is logged in.
//
// If we have a $user id here, it means we know the user is logged into
// Facebook, but we don't know if the access token is valid. An access
// token is invalid if the user logged out of Facebook.
if ($user) {
try {
// Proceed knowing you have a logged in user who's authenticated.
$user\_profile = $facebook->api('/me');
} catch (FacebookApiException $e) {
error\_log($e);
$user = null;
}
}
// Login or logout url will be needed depending on current user state.
if ($user) {
$logoutUrl = $facebook->getLogoutUrl();
} else {
$loginUrl = $facebook->getLoginUrl();
}
$user是通过sdk检测是否用户已经登录。
其中提到的几个方法分别说一下:
$facebook->getUser();
如果已登录,$user就是用户id,否则为空。
$facebook->getLogoutUrl();
如果用户已经登录,可以通过此方法,获取一个退出的链接。
$facebook->getLoginUrl(); 如果用户未登录,可以通过此方法,获取一个登录的链接。点击该链接会到一个登录页面并授权的页面,登录成功并确认授权后会返回之前的页面。
$facebook->api(‘/me’);
获取当前登录用户的详细信息;如果要访问某用户的信息,比如naitik’,则可以写做:
$facebook->api(‘/naitik’);
其中,$facebook->api(‘/me’); 就是调用具体api的写法。
前面的文章中提到过js sdk的使用,有这么一段:
FB.api({path}, 'GET', {}, function(response){
if (!response || response.error) {
alert('Error occured');
}
else {
…
}
})
其实这里的写法也是完全类似的,第一个参数就是路径,第二个参数是访问谓词,一般是GET、POST、DELETE等,第三个参数是一个数组,就是对应的方法的文档中所需要的参数。当然,我们这个程序就不需要回调函数了,呵呵,下面有一个完整的写法示例:
$facebook->api('/daaku.shah', 'DELETE', array(
'client\_id' => self::MIGRATED\_APP\_ID));
总的来看,facebook提供的sdk还是比较好用的。虽然在论坛上有许多人说它难用,但我估计是因为facebook太庞大了,api研究不过来,不像优库那样只有一个接口。对比严重抄袭facebook的renren,renren的api设计的简直是欠抽:那个东西才叫做难用,搞好几天都调不通!再一个,说说土豆,文档跟进缓慢,很多东西忘记写入文档了???而且示例也不通!
废话说多了,把国内的几个网站都得罪了,不过还是希望提到的几个网站能够及时优化,开发平台如果很难用,就别开放了。
好了,关于php sdk的入门就写到这里,感觉往下也没有什么好写的了(难道要写具体的api方法?)。如果朋友们有兴趣,欢迎留言,我们再深入探讨。
20OCTOBER |
|---|
[kivu]( “[email protected]”) -
嘻嘻,不错,写得很详细,把你这网址收藏了,有机会可以交流!
[kivu]( “[email protected]”) -
http://www.facebook.com/wbintl?sk=app_276923065674608在这个专题应用程序页,你的facebook就算登陆了,也得在这里 login一次才不会返NULL。请问LOGIN这一步能跳过?我想客户打开这个应用程序,直接获取他当前语言,选择对应语言专题。?
这个链接看似应该是打开一个应用,但链接并没有通过应用的方式去打开,如果链接:
http://www.facebook.com/276923065674608
则会到应用的介绍页面,点进入应用会有授权。
如果链接:
http://apps.facebook.com/wbabout/
直接到应用页面。
不知道是这个意思么?
[kivu]( “[email protected]”) -
facebook 换版了,以前在应用程序里点See App Timeline View然后就可以选择要把这个应用程序加到哪个专页的,现在不知道改哪里去,嘻嘻,你也看看怎么样才能把应用加入到指定专页!
[Jason]( “[email protected]”) -
ok,我正好有时间。
19OCTOBER |
|---|
Apache支持两种形式的虚拟主机,分别是基于名称的虚拟主机和基于IP的虚拟主机,今天下午经过几次实验,终于调试通过。现分析给大家:
基于名称的虚拟主机,是根据不同的ServerName,将站点指向不同的目录的一种形式。一般适用于只拥有一个IP,但拥有多个域名的情况。配置基于名称的虚拟主机,需要在httpd.conf中添加如下配置(此处以802端口为例):
NameVirtualHost \*:802
<VirtualHost \*.802>
ServerAdmin [email protected]
DocumentRoot "D:/program files/htdocs/fbsdk/"
ServerName www.fb.com
ServerAlias www.fb.com
</VirtualHost>
在这里需要说一下的是:
基于IP的虚拟主机,是根据不同的IP,将站点指向不同目录的一种形式。适用于有多个ip和域名,且每个域名拥有一个独立IP的情况。具体写法如下(此处以端口801为例):
Listen www.fb.com:801
<VirtualHost www.fb.com:801>
DocumentRoot "D:program filesxampphtdocsfbsdk"
ServerName www.fb.com:801
ServerAdmin [email protected]
</Virtualhost>
这里,第一行可以直接写做
Listen 801
而ServerName的位置也可以不写端口号。
比较下代码,其实不难发现,前面我所出现的问题,其实是因为缩写的代码造成冲突引起的。基于名称的虚拟主机的配置中,代码段
参考资料:
19OCTOBER |
|---|
1 编辑httpd.conf,查找Include conf/e… [kivu23]( “[email protected]”) -
wamp5下的虚拟主机的配置
1 编辑httpd.conf,查找Include conf/extra/httpd-vhosts.conf,把前面注释符号“#”删掉。
2 编辑httpd-vhosts.conf,我把WAMPServer安装在D:/wamp,所以我这里的路径是D:wampApache2confextra。
把里面的内容清空掉,换成下面的内容:
NameVirtualHost *:80
ServerName www.host1.com
ServerAlias www.host1.com
DocumentRoot “D:/wamp/www/host1″
ServerName www.host2.com
ServerAlias www.host2.com
DocumentRoot “D:/wamp/www/host2″
3 编辑httpd.conf,找到DocumentRoot “d:/wamp/www/”这项,这是默认根目录路径,但是要更改的不是这个,一直往下找,找到,然后在该后加上如下内容:
Options Indexes FollowSymLinks
AllowOverride all
Order Allow,Deny
Allow from all
Options Indexes FollowSymLinks
AllowOverride all
Order Allow,Deny
Allow from all
4 修改C:/WINDOWS/system3/drivers/etc/host这个文件,用记事本打开,加上如下内容:
127.0.0.1 www.host1.com
127.0.0.1 www.host2.com
好了,然后重启apache,在浏览器里面输入www.host1.com,看看访问到的内容是不是host1这个目录呢。
[Jason.Z]( “[email protected]”) -
@kivu23
多谢@kivu23 提供wamp5下的配置方法!
[kivu23]( “[email protected]”) -
@Jason.Z
嘻嘻,我又回来了,关注你出新东西,学学习
[Jason.Z]( “[email protected]”) -
多谢多谢,最近比较忙,写的东西少,我会尽量努力,争取多写一些好的东西出来。
14OCTOBER |
|---|
最近搞了几个免费的php空间,分别在上面安装了Joomla, Wordpress, Drupal这几个开源的php内容管理系统,本来还想试试xoops,但免费空间上传确实太慢了,没能完成其安装和测试,先拿这几个比比吧。
wordpress使用时间相对长一些,最初在新浪sae中搭建自己的博客使用的就是这个系统,插件很丰富,国内也有很多专门针对wordpress进行开发的团队,至于提供theme和plugin介绍和下载的站点也不计其数。代码看起来也比较简单,稍微有些php的知识,就可以完成代码及功能的修改。汉化也很完善,不懂英语的人也可以使用该平台迅速搭建自己的博客平台。
当然,wordpress定位于博客系统,做博客非常合适。但是做其他就有点困难了。前些日子仅仅了解wordpress,对一个要做自己公司网站的朋友推荐了wordpress系统,当然也可以实现,毕竟稍微稍有点别扭。只能说,在简单易用上,wordpress是胜了的。
wordpress安装皮肤和插件还算比较简单,下载了之后,解压,然后上传到web站点的对应目录即可。
Joomla!汉化还是比较完整的,国内有许多专门的Joomla!爱好者站,后台的管理界面很漂亮,而且安装过程中还可以安装示例数据,这样就比较容易理解哪里的数据对应哪部分内容。
Joomla!有很多特别漂亮的皮肤,当然其中大多是收费的(谁闲的没事去做特别漂亮的皮肤,然后免费共享出去啊!),也有很多收费的组件和扩展。
说白了,Joomla!是一种形式的生态系统,许多人在免费使用它,也有许多人或公司依靠制作组件、扩展和皮肤来赚钱。
不过互联网上也常常传来不同的声音,说Joomla!不好的,怪它收费的,说要离开Joomla!去做drupal的。其实是其定位不同,不同的人适合不同的情况而已。
Drupal国内也有很多爱好者,据说文档很全。但我看到的结果是在国内爱好者还是比较少的,至少要比Joomla要少。而且几乎没有中文的文档。
Drupal的优势是其架构很优秀,使用该架构为基础,在其上进行二次开发会比较顺手。当然,这也有一定的学习成本,像我这样刚刚试着装了Drupal的新手,完全不知道在后台应该干啥。
Drupal代码只有2M多,上传到免费空间也就不成问题,网上说的优势也挺多。但是我分别在本地和免费空间上安装后,发现它运行速度明显比Joomla!慢,而且慢的不是一点半点。
插件和皮肤的安装特别简单,它和Joomla都提供了直接根据下载路径进行安装的功能,甚是方便。但其对插件的管理方式又有所不同,Drupal全都罗列出来,看着很头疼。而且插件启用的多了,内存竟然占满了(免费空间大概仅仅提供几十兆的内存),新手遇到大问题了,哈哈。
先看看各公开的参数比较:
系统要求
Drupal
Joomla
Wordpress
费用
免费
免费
免费
操作系统
任何
任何
与操作系统无关
许可
GNU GPL
GNU/GPL v2
GNU GPL
编程语言
PHP
PHP
PHP 4.2版本或更高
根权限(Root Access)
没有
没有
没有
命令行权限(Shell Access)
没有
没有
没有
网络服务器
Apache, IIS
Apache
Apache, mod_rewrite
安全
Drupal
Joomla
Wordpress
审核跟踪
是
否
有限的
验证码
自由添加*
自由添加
否
内容核准
是
是
是
Email核实
是
是
自由添加
登录历史
是
是
自由添加
插件认证
是
是
是
问题通知
否
否
自由添加
Sandbox
否
否
有限的
Session 管理
是
是
自由添加
SSL 兼容
是
是
是
版本控制
是
自由添加
自由添加
支持
Drupal
Joomla
Wordpress
商业手册
有
有
无
商业支持
有
有
无
商业培训
有
有
无
开发者社团
有
有
有
在线帮助
有
有
有
插件 API
有
有
有
专业服务
有
有
无
论坛
有
有
有
第三方开发者
有
有
有
用户讨论会
有
有
有
易用性
Drupal
Joomla
Wordpress
拖放内容
自由添加
否
是
邮件讨论
自由添加
自由添加
有限的
友好的 URLs
是
是
是
批量上传
自由添加
是
自由添加
拼写检查
自由添加
否
自由添加
样式向导
有限的
否
否
订阅
自由添加
自由添加
是
模板语言
有限的
是
否
用户界面层
否
是
是
撤消编辑
有限的
否
自由添加
所见即所得编辑
自由添加
是
是
Zip归档
否
否
自由添加
性能
Drupal
Joomla
Wordpress
高级缓存
有
有
自由添加
数据库复制
有限的
无
无
负载平衡
有
有
无
页面缓存
有
有
自由添加
静态内容输出
无
无
有限的
管理
Drupal
Joomla
Wordpress
广告管理
自由添加
有
需要插件
剪贴板
无
无
无
内容时序安排
自由添加
有
自由添加
在线管理
是
是
是
主题 / 皮肤
有
有
有
回收管理
无
有
无
网站统计
有
有
自由添加
在线主题设计管理
是
是
是
在线翻译管理
有
自由添加
有限的
流程自动化引擎
有限的
无
无
灵活性
Drupal
Joomla
Wordpress
内容重用
有限
是
否
可扩充的用户资料
是
是
否
多语言内容
是
自由添加
自由添加
多网站部署
是
自由添加
否
RSS
有
有
有
FTP 支持
有限的
是
自由添加
UTF-8 支持
是
是
是
CGI 模式支持
是
是
否
元数据(Metadata)
有
有
有
URL重写
是
是
是
商业
Drupal
Joomla
Wordpress
代理跟踪
自由添加
自由添加
无
库存管理
自由添加
自由添加
无
可插式支付
自由添加
自由添加
无
可插式货运
自由添加
自由添加
无
可插式传真
自由添加
自由添加
无
销货点
无
自由添加
无
购物车
自由添加
自由添加
无
wordpress适合做博客;Joomla!适合在无技术能力上的企业网站搭建,功能要比wordpress强大,美中不足就是想要的东西都得收费;Drupal,做啥都行很好很强大,不过你要是不会玩,还真玩不动,就是有门槛。
23SEPTEMBER |
|---|
最近工作比较乱,不想多说。研究一周多的php工作要暂停,不知道到时候恢复的时候是不是能想的起来。先记录下来一部分,做个备忘,免得将来又从头开始。
环境配置不记录了,前面有提到。zend framework就是一组类库,下载下来放在站点根目录的library目录中即可,index.php做程序入口,所有访问经该入口路由到具体的处理。
根据当前的开发方式,实际开发时,每创建一个页面,有以下几个步骤:
在application目录的models目录下,创建表的表对象,其实很简单,通过zend studio可以直接创建,代码如下:
<?php
require_once ‘Zend/Db/Table/Abstract.php’;
class feed extends Zend_Db_Table_Abstract
{
/**
* The default table name
*/
protected $_name = ‘feed’;
}
这是一个简单的feed对象,对应数据库中的feed表,有了它以后,可以直接用面向对象的方式访问该表,而不需要编写sql语句。当然,也可以在里面封装些数据库的常用操作方法。数据操作的方法记录在后面。
比如
routes.register.type = “Zend_Controller_Router_Route_Static”
routes.register.route = “user/register”
routes.register.defaults.controller = “register”
routes.register.defaults.action = “index”
这是一段注册页面的配置,注册类型是静态地址,地址为user/register,对应的控制器是register,控制器中的action是index。
再看另一段配置:
routes.shot.route = “project/shot/list/:pid”
routes.shot.defaults.controller = “shot”
routes.shot.defaults.action = “index”
routes.shot.map.1=“pid”
这里pid是参数,意为project/shot/list/xx 这样一个路径xx就是pid参数,可以用request方式获取到值。
在我们的方法中,所有程序都放在了modules文件夹中,在modules/default/controller中创建控制器,比如我们路由中有个register的控制器,其名称就是:registerContrlller.php。
看下面这个代码:
<?php
require_once ‘Zend/Controller/Action.php’;
class shotController extends Zend_Controller_Action{
public function init ()
{
$this->_helper->layout()->setLayout(“default”);
}public function indexAction ()
{…
}
}
这个控制器是针对前面第二段路由配置的,类名是shotController,继承自
Custom_Controllers_AuthController(这个zendstudio会自动生成,不用担心记不住),indexAction就是该路由的触发的动作,一个控制器中可以有多个action。init方法是初始化方法,比如某控制器中有多个action,则每个action执行前都会执行init方法。
所谓模板,就是以phtml为后缀的一个html块,不过其中可以写php代码,示例:
New Shot
<?php
echo $this->form;?>
Shot List
shot budget
<?php
if($this->shots!=null){
foreach ($this->shots as $u){
?>
<?php echo $u->name ?> <?php echo $u->budget ?> id?>‘>edit Shapez Theme
· Home Playground About
09
SEPTEMBER确认的php和apache环境配置:
1.请PHPer确认你的PHP版本是否在5.2.0以上..如果不是的话..请更新到5.2.0,否则.Zend Framework 好像用不了。
PHP源码最新版下载地址为:http://www.php.net/downloads.php.
2.你的PHP环境配置好了之后,请打开php.ini文件,确认PDO扩展是否打开:
;extension=php_mysql.dll
;extension=php_pdo.dll
;extension=php_pdo_mysql.dll
修改
extension=php_mysql.dll
extension=php_pdo.dll
extension=php_pdo_mysql.dll 去掉分号
还有:
; Windows: “path1;path2”
include_path = “.;c:phpincludes;e:wwwrootzendflibrary” (zend framework的libary支持)3.打开APACHE文件夹里面的httpd.conf文件.配置mod_rewrite.so的支持
#LoadModule rewrite_module modules/mod_rewrite.so
修改:LoadModule rewrite_module modules/mod_rewrite.so (去掉#号)才支持Zend framework4. 查找到httpd.conf文件,如果AllowOverride为None的话..请一定把None都改成all.这样你写.htaccess这样的文件才会起到作用..
将所有的:AllowOverride None替换AllowOverride all 支持.htaccess文件
5.重新启动你的APACHE服务器.这样我们的PHP环境就可以运用Zend Framewrok了.
安装zend tool
下载zend framework的zip文件,解压,配置环境变量的path路径:
在path变量的结尾处增加:
;D:Program FilesZendZendFrameworkbin
该路径是解压目录中的bin目录的路径,注意前面的;不用丢掉
测试安装是否成功:
在命令行中输入:
zf show version
这句话是显示版本,如果顺利,会输出版本,否则会报错。我这里显示:
zend framework version:1.11.10
创建项目
可以使用zendtool创建项目,命令行:
通过命令行进入站点根目录(一般是htdocs目录),键入命令:
zf create project zf_proj
然后回车,会创建一个zf_proj的目录,里面自动创建一些必要的文件和文件夹。目录结构如下:
如果没有安装phpuint这个单元测试工具的话,会有提示,不过没关系,不用理它。
当然,你也可以把下载的目录拷贝到自建的目录,刚才那个命令并未做任何配置的工作。
一般来说,图片、js和css文件要防止public目录下,而library文件夹里面要放下在到的zendframework的文件,就是把压缩包里的library文件夹里的内容(其实只有一个zend文件夹)拷贝过来就可以了。
好了,现在我们测试下,打开以下地址:
就可以看到欢迎页面,这里就不上图了。