Archive for the ‘PHP’ Category

改进smarty使之能够定时自动清空缓存

smarty的缓存机制不是太完善,只会判断当前的缓存文件是否过期,如果过期就写入新的缓存,这样缓存只会越来越多,硬盘也总有hold不住的那天。那么,我们就来改进下smarty使之能够定时自动清空缓存

1、打开Smarty.class.php在smarty这个类中添加一个变量:

 /**
* @每2天 早上10点清空缓存
*/
var $clear_cache_time = ’2 10′;

2、在smarty类中添加两个方法:一个执行自动清空缓存的任务,一个判断是否需要清空

 private function autoClearCache()
{
if($this->checkClearTime()){
$this->clear_all_cache(); //删除所有已过期的缓存
}
}

private function checkClearTime()
{
$CacheParam = explode(” “,$this->clear_cache_time);

if(!$this->clear_cache_time || count($CacheParam) !== 2)
{
return false;
}

if(date(‘H’) != $CacheParam[1])
//当前的 小时 不为 设定的需要清空的 小时,返回false
{
return false;
}

$cachetag = $this->compile_dir.”/autoclear.tag”;
//设定一个文件,用于记录上次自动清空的时间

if (file_exists($cachetag))
{
$filetime = date(‘U’, filemtime($cachetag));
//返回文件内容上次修改的时间

if(date(‘d’)-date(“d”,$filetime) == $CacheParam[0])
//如果现在距离上次文件修改时间的天数 为 设定的自动清空缓存的天数
{
return true ;
} else {
return false ;
}
}

file_put_contents($cachetag,date(“Y-m-d H:i:s”));
//如果不存在autoclear.tag文件,则创建并写入当前时间

return true;
}

3、在smarty本来的fetch方法的头部加上一句

$this->autoClearCache();
//也就是每次执行smarty的过程中,都进行自动清空缓存的操作

ok,这样简单的一个通过设定每几天 某个时间段内自动清空缓存的操作就完成了。当然,如果觉得功能满足不了自己的要求,那么开动自己的脑筋,敲敲最爱的键盘,开始自己的smarty自动清空缓存之路吧。

Ajax 与 Smarty,第 1 部分: 使用 Smarty 开发 Ajax 应用

使用 PHP、Smarty 模板引擎和 jQuery 框架创建 Ajax 应用

Andrei Cioroianu, 高级 Java 开发人员和顾问, Devsphere

 

简介: Smarty 是一个 PHP 模板引擎,它可以帮助您将 Web 应用的业务逻辑与表示层分离。Smarty 目前没有内置的 Asynchronous JavaScript and XML (Ajax) 支持,但是您可以轻松地扩展它的插件架构并将它与一些 JavaScript 框架整合,如 jQuery。本系列文章将阐述如何在 Ajax 应用中使用 Smarty,如何创建 Smarty 插件,以及如何改进您的 Web 应用的代码质量,使代码更具可读性和更容易维护。

在本系列文章的第一篇中,您将了解如何使用 Smarty 模板为 Ajax 请求生成 JSON、XML 和 HTML 响应。这些技术允许您在开发 PHP 代码时关注于应用逻辑,而这些应用逻辑是与 Ajax 客户端和服务器之间通信所使用的数据格式分离的。

您还将了解如何创建两个版本的表单,其中一个提供输入域让用户输入数据,另一个使用隐藏域并以不可编辑形式显示数据。通过单击一个按钮,用户能够切换两个版本的表单,使用 Ajax 向服务器提交数据并获取用于更新页面的 HTML 内容。此外,这个表单在 Web 浏览器禁用 JavaScript 时仍然能够使用。

本文的最后一部分包含配置 Smarty 和示例应用的说明。如果您的服务器或工作站启用了 SELinux,这个过程会有些复杂。这些信息对于需要修改公共文件的 Web 应用是很有用的,如内容管理系统和允许用户上传内容的网站。不管您使用的是 Smarty、流行 CMS 或定制系统,在您的代码尝试修改 Web 文件时,您都会遇到相同的与 SELinux 有关的配置问题。本文阐述了如何使用 Linux 的restoreconchcon 和 setsebool 命令解决这些问题。

使用 Smarty 生成 Ajax 响应

在本节中,我们将了解如何创建用来为 Ajax 请求生成响应的 Smarty 模板。您可以使用任何一种通用格式,如 JSON、XML 或 HTML。Smarty 语法主要是面向 HTML 设计的,这使它也非常适合于 XML。然而,使用 Smarty 创建 JSON 响应会有一些困难,因为模板构建的语法使用了 { 和 },这意味着如果 JSON 使用了这两个字符,您需要对它们进行转义。然而,您会发现可以修改 Smarty 的分隔符以避免这个语法冲突。您还将了解如何创建自定义修饰符和函数,并将它们注册到 Smarty 框架,这样您就能够在您的模板中使用它们了。

使用 Smarty 生成 XML 文档

让我们从一个简单的例子(如清单 1 所示)开始,它将生成一个可以被 Ajax 客户端使用的 XML 响应。首先,PHP 代码应该设置内容类型以及 no-cache 响应头,它可以保证 Web 浏览器不会缓存 Ajax 响应。考虑到您以前可能没有使用过 Smarty,我们在这里简要介绍一下 demo_xml.php 文件的作用:它通过 require 包含了 Smarty 类,创建了这个类的一个实例,设置了它的编译和调试标记,使用 assign() 创建两个名为 root_attr 和 elem_data 的变量,然后使用 display() 调用一个 Smarty 模板,这样就将生成了 XML 响应。
清单 1. demo_xml.php 示例

				
<?php
header("Content-Type: text/xml");
header("Cache-Control: no-cache");
header("Pragma: no-cache");

require 'libs/Smarty.class.php';

$smarty = new Smarty;

$smarty->compile_check = true;
$smarty->debugging = false;
$smarty->force_compile = 1;

$smarty->assign("root_attr", "< abc & def >");
$smarty->assign('elem_data', array("111", "222", "333"));

$smarty->display('demo_xml.tpl');

?>

demo_xml.tpl 模板(见清单 2)生成了一个 <root> 元素,它有一个属性,它的值是从 demo_xml.php 文件的变量 root_attr 查询的。字符 <>"' 和 & 分别使用 Smarty 的 escape 修饰词替换成 &lt;&gt;&quot;&apos; 和 &amp;。在 root 元素中,模板使用 Smarty 的 {section} 遍历 elem_data 数组的元素,这个数组是 demo_xml.php 文件中定义的第二个变量。demo_xml.tpl 会为数组中的每一个元素生成包含从数组查询到的值的 XML 元素。
清单 2. demo_xml.tpl 模板

				
<root attr="{$root_attr|escape}">
    {section name="d" loop=$elem_data}
        <elem>{$elem_data[d]|escape}</elem>
    {/section}
</root>

清单 3 包含了由 demo_xml.php 文件和 demo_xml.tpl 模板生成的 XML 输出。
清单 3. XML 输出

				
<root attr="&lt; abc &amp; def &gt;">
            <elem>111</elem>
            <elem>222</elem>
            <elem>333</elem>
</root>

使用 Smarty 创建一个 JSON 响应

demo_json.php 文件(如清单 4 所示)设计了 no-cache 头,并且如清单 3 所示例子一样创建和配置了 Smarty 对象。此外,它还定义了两个名为 json_modifier() 和 json_function() 的函数,它们会调用 json_encode() PHP 函数。这两个函数被注册到 Smarty 上,这样它们就可以在模板中使用了,您将在本节的后面看到如何使用。在这之后,demo_json.php 文件创建了一些以下类型的 Smarty 变量:字符串型、数字型、布尔型和数组。然后,PHP 例子执行 demo_json.tpl 模板生成 JSON 响应。
清单 4. demo_json.php 示例

				
<?php
header("Content-Type: application/json");
header("Cache-Control: no-cache");
header("Pragma: no-cache");

require 'libs/Smarty.class.php';

$smarty = new Smarty;

$smarty->compile_check = true;
$smarty->debugging = false;
$smarty->force_compile = 1;

function json_modifier($value) {
    return json_encode($value);
}

function json_function($params, &$smarty) {
    return json_encode($params);
}

$smarty->register_modifier('json', 'json_modifier');
$smarty->register_function('json', 'json_function');

$smarty->assign('str', "a\"b\"c");
$smarty->assign('num', 123);
$smarty->assign('bool', false);
$smarty->assign('arr', array(1,2,3));

$smarty->display('demo_json.tpl');

?>

除了注册插件(如修饰符或函数)到 Smarty,您也可以使用 Smarty 文档中描述的一些特别的命名规范 (见 参考资料)。然后您可以将您的代码放到 plug-ins 目录,这样您的 Smarty 修饰符和函数就可以在应用的任何 Web 页面中使用。

因为 JSON 和 Smarty 的语法中都使用了 { 和 },所以您必须在 Smarty 模板中使用 {ldelim} 和 {rdelim} 生成 JSON 响应中使用的 {和 } 字符。您也可以将 { 和 } 放到 {literal} 和 {/literal} 之间。您将在另一个例子中看到,我们可以修改 Smarty 分隔符以避免这样的麻烦。

demo_json.tpl 模板(见清单 5)使用 json 修饰符对 demo_json.php 文件中的四个变量值进行编码。例如,对引号和其它特殊字符进行转义是很有用的,如字符串中的制表符和换行符。Smarty 将会在 demo_json.php 文件中模板每次使用 |json 时调用json_modifier()json 修饰符前面必须加上 @ 字符,这样数组变量就可以传递到 json_modifier()。如果没有使用 @ 字符,修饰符函数会对数组的每一个元素进行调用。

从 demo_json.tpl 模板构建的 {json ... } 会被转换成 demo_json.php 文件的 json_function() 的一个调用。这个函数会从模板中获取一个名为 params 的数组属性,同时被传递到 json_encode(),这个函数会返回 JSON 表示的 PHP 数组。
清单 5. demo_json.tpl 模板

				
{ldelim}
	s: {$str|json},
	n: {$num|json},
	b: {$bool|json},
	a: {$arr|@json},
	o: {json os=$str on=$num ob=$bool oa=$arr},
	z: {literal}{ x: 1, y: 2 }{/literal}
{rdelim}

清单 6 包含了由 demo_json.php 文件和 demo_json.tpl 模板生成的 JSON 输出。
清单 6. JSON 输出

				
{
	s: "a\"b\"c",
	n: 123,
	b: false,
	a: [1,2,3],
	o: {"os":"a\"b\"c","on":123,"ob":false,"oa":[1,2,3]},
	z: { x: 1, y: 2 }
}

要避免在 Smarty 模板中使用 {ldelim} 和 {rdelim},您可以修改如清单 7 所示的 Smarty 分隔符。
清单 7. 修改 Smarty 分隔符

				
$smarty->left_delimiter = '<%';
$smarty->right_delimiter = '%>';

清单 8 所示的模板使用 Smarty 构件中的 <% 和 %> 分隔符生成 JSON 响应。
清单 8. demo_json2.tpl 模板

				
{
	s: <% $str|json %>,
	n: <% $num|json %>,
	b: <% $bool|json %>,
	a: <% $arr|@json %>,
	o: <% json os=$str on=$num ob=$bool oa=$arr %>,
	z: {  x: 1, y: 2 }
}

使用 Smarty 创建一个 Ajax

本节的例子说明了如何使用 Smarty 生成使用 Ajax 获得的 HTML 内容。此外,这个 Web 页面也包含了一个 HTML 表单,这个表单的数据是使用 jQuery 框架以 Ajax 方式提交到服务器上的。如果 Web 浏览器禁用了 JavaScript,这个表单仍然会正确工作,Smarty 也仍然可用在服务器端生成内容。

使用 Smarty 处理 HTML 表单

demo_form.tpl 模板(见清单 9)包含了一个 HTML 表单,这个表单的域可能是可编辑的,也可能是不可编辑的,这取决于名为edit_mode 的变量值。这个变量是在调用模板的 PHP 代码中设置的,您将会在本节的后面看到。edit_mode 的值也会被存储在表单的一个隐藏域中。
清单 9. demo_form.tpl 模板的 HTML 表单

				
<form method="POST" name="demo_form">

<input type="hidden" name="edit_mode" 
    value="{if $edit_mode}true{else}false{/if}">

<table border="0" cellpadding="5" cellspacing="0">
    ...
</table>

</form>

清单 10 显示的是表单的第一个域,如果 edit_mode 是 true,它就是一个输入框;如果 edit_mode 是 false,它就是一个隐藏域。在后一种情况中,这个域的不可编辑值会被 {$smarty.post.demo_text|escape} 包含在输出中。当用户提交这个可编辑表单时,参数demo_text 包含了用户的输入。当表单是不可编辑的,由于有一个隐藏域,这个参数仍然会出现。因此,不管表单是否可以编辑,我们都可以使用 $smarty.post.demo_text 获得这个 post 参数的值。
清单 10. demo_form.tpl 模板的文本框

				
    <tr>
        <td>Demo Text:</td>
        <td>
            {if $edit_mode}
                <input type="text" name="demo_text" size="20"
                    value="{$smarty.post.demo_text|escape}">
            {else}
                <input type="hidden" name="demo_text" 
                    value="{$smarty.post.demo_text|escape}">
                {$smarty.post.demo_text|escape}
            {/if}
        </td>
    </tr>

这个表单的下一个输入域是一个复选框(见清单 11)。在可编辑的表单中,元素 input 只有在出现参数 demo_checkbox 时才会有一个属性 checked。类似地,不可编辑的表单只有在所提交表单数据中包含了名为 demo_checkbox 的 post 参数时才会包含这个隐藏表单元素。
清单 11. demo_form.tpl 模板的复选框

				
    <tr>
        <td>Demo Checkbox:</td>
        <td>
            {if $edit_mode}
                <input type="checkbox" name="demo_checkbox" 
                    {if $smarty.post.demo_checkbox}checked{/if}>
            {else}
                {if $smarty.post.demo_checkbox}
                    <input type="hidden" name="demo_checkbox" value="On">
                {/if}
                {if $smarty.post.demo_checkbox}On{else}Off{/if}
            {/if}
        </td>
    </tr>

表单的表格的下面一行包含了三个单选按钮(见清单 12)。模板代码通过比较参数 demo_radio 与每个按钮的值决定应该选择哪个单选按钮。不可编辑的表单使用一个隐藏输入域存储参数值并使用 $smarty.post.demo_radio 向用户显示这个值。
清单 12. demo_form.tpl 模板的单选按钮

				
    <tr>
        <td>Demo Radio:</td>
        <td>
            {if $edit_mode}
                <input type="radio" name="demo_radio" value="1"
                    {if $smarty.post.demo_radio == '1'}checked{/if}>1
                <input type="radio" name="demo_radio" value="2"
                    {if $smarty.post.demo_radio == '2'}checked{/if}>2
                <input type="radio" name="demo_radio" value="3"
                    {if $smarty.post.demo_radio == '3'}checked{/if}>3
            {else}
                <input type="hidden" name="demo_radio" 
                    value="{$smarty.post.demo_radio|escape}">
                {$smarty.post.demo_radio|escape}
            {/if}
        </td>
    </tr>

一个表单列表的选项是在一个循环的 {section} 中生成的,如清单 13 所示。当前循环的次数会被赋值给一个名为 demo_counter 的模板变量,它会与选项元素的值进行比较以便确定这个选项是否被选中。
清单 13. demo_form.tpl 模板的列表

				
    <tr>
        <td>Demo Select:</td>
        <td>
            {if $edit_mode}
                <select name="demo_select" size="1">
                    {section name="demo_section" start=10 loop=100 step="10"}
                        {assign var="demo_counter"
                            value=$smarty.section.demo_section.index}
                        <option {if $smarty.post.demo_select == $demo_counter}
                                selected{/if} value="{$demo_counter}">
                            {$demo_counter}
                        </option>
                    {/section}
                </select>
            {else}
                <input type="hidden" name="demo_select" 
                    value="{$smarty.post.demo_select|escape}">
                {$smarty.post.demo_select|escape}
            {/if}
        </td>
    </tr>

提交按钮会根据 edit_mode 标记(见清单 14)的不同值显示不同的标签(Save 或 Edit)。onclick 属性包含了一个名为submitDemoForm() 的 JavaScript 函数调用。您将会在本文后面的内容中看到这一点,这个函数使用 Ajax 将表单数据提交到服务器,然后返回 false,这样 Web 浏览器不会多次响应按钮的单击事件而提交相同的数据。然而,如果 JavaScript 被禁用了,submitDemoForm() 将不会被调用,而 Web 浏览器就会将表单提交到服务器上。因此,这个表单不管 JavaScript 是否启用都会生效。
清单 14. demo_form.tpl 模板的提交按钮

				
    <tr>
        <td>&nbsp;</td>
        <td>
            <button type="submit" onclick="return submitDemoForm()">
                {if $edit_mode}Save{else}Edit{/if}
            </button>
        </td>
    </tr>

开发页面模板

demo_page.tpl 文件(见清单 15)包含了两个 <script> 元素,其中一个是引用 jQuery,另一个是引用示例应用中的 JavaScript 文件。这个页面模板使用 Smarty 的 {include} 包含了元素 <div> 中的一个表单模板。
清单 15. demo_page.tpl 模板

				
<html>
<head>
    <title>Demo</title>
    <script type="text/javascript" 
        src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js">
    </script>
    <script type="text/javascript" src="demo_js.js">
    </script>
</head>
<body>
    <div id="demo_div">
        {include file="demo_form.tpl"}
    </div>
</body>
</html>

为 Smarty 和 Ajax 创建一个 PHP 控制器

demo_html.php 文件(如清单 16 所示)是 Ajax 和 Smarty 之间的桥梁,负责处理 Ajax 请求并在 demo_form.tpl 模板中使用 Smarty 生成 Ajax 响应,而这个模板只有当出现一个 Ajax 请求头时才会被调用。这个头是在 JavaScript 代码中设置的,您将在下面的小节中看到。如果没有 Ajax 头,这些代码就会使用 demo_page.tpl 模板,这意味着这是 Web 浏览器 的初始页面请求或 JavaScript 被禁用。在每一个请求中,edit_mode 标记的值都会转换成另一个可编辑表单,并且它是不可编辑的。
清单 16. demo_html.php 示例

				
<?php
header("Cache-Control: no-cache");
header("Pragma: no-cache");

require 'libs/Smarty.class.php';

$smarty = new Smarty;

$smarty->compile_check = true;
$smarty->debugging = false;
$smarty->force_compile = 1;

$edit_mode = @($_REQUEST['edit_mode'] == "true");
$smarty->assign("edit_mode", !$edit_mode);

$ajax_request = @($_SERVER["HTTP_AJAX_REQUEST"] == "true");
$smarty->display($ajax_request ? 'demo_form.tpl' : 'demo_page.tpl');

?>

使用 Ajax 调用 Smarty 模板

单击表单按钮时会调用 submitDemoForm() 函数(见清单 17)。这个函数会通过 jQuery 使用 POST 和 Web 表单的相同 URL 将表单数据发送到服务器。然后表单数据会被 jQuery 的 serialize() API 编码成一个字符串。在本例中,jQuery 在发送 Ajax 请求之前会调用beforeSend() 函数设置 Ajax-Request 头,这个信息是服务器端用以确定 Ajax 请求的。在 Ajax 请求结束后,success() 函数会被调用。这个回调函数会将响应内容插入到 Web 页面的 <div> 元素中。
清单 17. demo_js.js 示例

				
function submitDemoForm() {
    var form = $("form[name=demo_form]");
    $.ajax({
        type: "POST",
        url: form.action ? form.action : document.URL,
        data: $(form).serialize(),
        dataType: "text",
        beforeSend: function(xhr) {
            xhr.setRequestHeader("Ajax-Request", "true");
        },
        success: function(response) {
            $("#demo_div").html(response);
        }
    });
    return false;
}

在启用 SELinux 时建立 Smarty

在解压缩示例应用后,您应该会看一个名为 ajaxsmarty 的目录,它包含了多个 PHP 文件、一个 JavaScript 文件和四个子目录:cache、configs、templates 和 templates_c。模板目录包含了示例应用的 Smarty 模板。其它三个子目录是空的。

下载最新稳定版本的 Smarty (见 参考资料),然后解压缩它。(示例项目是在 Smarty 2.6.25 下测试的。)接下来,将 Smarty 的子目录 libs 复制到 ajaxsmarty 目录,这个目录是示例应用的主目录。

将 ajaxsmarty 目录(同时包含示例应用和 Smarty 的 libs)上传或复制到 Apache 的 HTML 目录。如果您使用的是一个 Web 主机公司的服务器,SELinux 可能被禁用了,因为启用 SELinux 可能会有太多的支持呼叫。如果你在自己的 Linux 服务器上测试应用,您的服务器有可能启用了 SELinux,那么当浏览器请求一个 PHP 文件时您可能会得到下面的错误:“SELinux is preventing the httpd from using potentially mislabeled files.” 解决方法是以 root 身份运行清单 18 所示的命令。
清单 18. 设置 Web 文件的安全性上下文(标签)

				
restorecon -R -v /var/www/html/ajaxsmarty

至此,您应该能够在浏览器上打开地址:http://localhost/ajaxsmarty/,页面会显示三个链接。如果您单击其中一个链接,您会在 Web 浏览器上得到以下的 Smarty 错误:“Fatal error: Smarty error: unable to write to $compile_dir ‘/var/www/html/ajaxsmarty/templates_c’. Be sure $compile_dir is writable by the Web server user. in /var/www/html/ajaxsmarty/libs/Smarty.class.php on line 1113”。

出现上面的错误是因为 Smarty 安装还没有完成。您必须给 Web 服务器写 templates_c 和 cache 目录的用户权限。实现这一步的正确做法是修改它们的拥有者,如清单 19 所示。注意 apache 用户名和服务器的 HTML 目录在您的计算机上可能会有所不同。
清单 19. 修改两个目录的拥有者使 Smarty 能够创建文件

				
chown apache:apache /var/www/html/ajaxsmarty/templates_c 
chown apache:apache /var/www/html/ajaxsmarty/cache

如果您不是使用 root 用户登录,您是不能使用 chown 修改 templates_c 和 cache 的写权限的。您可以通过使用 FTP 客户端修改,或者使用 chmod 命令将权限设置为 777。允许所有用户都能写这些文件夹不是一个非常好的做法,但是如果您不能使用 chown 命令,这是您唯一快速有效的方法。如果您的 Web 服务器是公共的,您应该联系服务器管理员帮您完成这个修改。

如果您的计算机启用了 SELinux,您可能还会在浏览器上遇到这样的一个错误:“SELinux prevented httpd reading and writing access to http files.” 或 “SELinux is preventing httpd (httpd_t) write to ./templates_c (public_content_rw_t).” 解决方法是以 root 身份运行清单 20 中的命令。
清单 20. 在启用 SELinux 时允许 Smarty 在它的目录中创建文件

				
chcon -t public_content_rw_t /var/www/html/ajaxsmarty/templates_c 
chcon -t public_content_rw_t /var/www/html/ajaxsmarty/cache
setsebool -P allow_httpd_anon_write=1

带有 allow_httpd_anon_write 参数的 setsebool 命令必须只执行一次。它允许 httpd 守护进程将文件写到 public_content_rw_t 目录中。

结束语

在本文中,您了解了如何创建为 Ajax 请求产生 JSON、XML 和 HTML 响应的 Smarty 模板,如何使用 Smarty 创建一个即使在 Web 浏览器禁用 JavaScript 时仍然有效的 Ajax 表单,以及如何在启用 SELinux 的 Linux 主机上配置 Smarty。

回页首

下载

描述 名字 大小 下载方法
本文样例应用 ajaxsmarty_part1_src.zip 5KB HTTP

关于下载方法的信息
参考资料

学习

获得产品和技术

  • 下载 Smarty 并使用它。

讨论

关于作者

Andrei Cioroianu 是 Devsphere 公司的创始人,该公司专门提供 Java EE 开发和 Web 2.0/Ajax 顾问服务。他自 1997 年就开始使用 Java 和 Web 技术,具有 10 多年解决复杂技术问题和管理商业产品的整个生命周期以及定制应用程序和开源框架的专业经验。您可以通过 www.devsphere.com 上的联系列表与 Andrei 联系。

LNMP一键安装包 0.8发布

LNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RadHat、Debian/Ubuntu VPS(VDS)或独立主机安装LNMP(Nginx、MySQL、PHP、phpMyAdmin)生产环境的Shell程序。

LNMPA是在LNMP的基础上产生的新的扩展,目前LNMP一键安装包的用户可以直接升级到LNMPA(Nginx、MySQL、PHP、 Apache),由Nginx作为前端处理静态页面、js、图片等,Apache作为后端处理PHP,解决高并发时php-cgi的502问题,提高服务 器处理动态内容的能力及稳定性。

LNMP一键安装包 0.8 & LNMPA已经在VPSYOU(感谢提供测试VPS)、DiaHosting(感谢提供测试VPS)、PhotonVPS(感谢提供测试VPS)、vpszzMyHost123瑞豪开源VPSBurstNetLinodeYardVPSDirectSpaceThrustVPSBuyVM123Systems等多家美国VPS的CentOS、Debian、Ubuntu的32位和64位系统上测试通过(CentOS/Debian 均为5.0以上版本,Ubuntu为9.04以上版本),个别128MB小内存CentOS 64位模板存在问题,小内存请尽量选择32位。

LNMP安装教程:http://lnmp.org/install.html
LNMPA安装教程:http://lnmp.org/lnmpa.html
使用交流论坛:http://bbs.vpser.net/forum-25-1.html

LNMP相关软件版本:
Nginx 1.0.10
MySQL 5.1.60
PHP 5.2.17
PHPMyAdmin 3.4.8
相关更新:
1、优化安装过程及错误处理;
2、增加imageMagick安装脚本;
3、增加memcached安装脚本;
4、Nginx升级至1.0.10、MySQL升级至5.1.60;
5、优化PHP升级脚本;
6、优化Nginx升级脚本;
7、优化eAccelerator自动安装脚本;
其他组件安装
1、安装eAccelerator,执行如下命令:./eaccelerator.sh ,按提示选择版本,回车确认后,就会自动安装并重启web服务。

2、安装ionCube,执行如下命令:./ionCube.sh 回车确认后,就会自动安装并重启web服务。

3、安装imageMagick,执行如下命令:./imageMagick.sh 回车确认后,就会自动安装并重启web服务。

4、安装memcached,执行如下命令:./memcached.sh 回车确认后,就会自动安装并重启web服务。

5、 安装PureFTPd和管理面板,执行如下命令:./pureftpd.sh 按提示输入你MySQL的root密码、FTP用户管理面板的密码、MySQl的FTP数据库密码(可直接回车,自动生成一个密码),回车确认,就会自动 安装PureFTPd,安装完PureFTPd,在浏览器执行http://你的域名或IP/ftp/ 输入你前面设置的FTP用户管理面板的密码,就可以管理。

6、安装VsFTPD,执行如下命令:./vsftpd.sh 就会自动安装上vsftpd,只需要执行命令:useradd -d /home/wwwroot -s /sbin/nologin adminftp 添加上帐号指定好ftp帐号的根目录,再执行:passwd adminftp 设置上密码,登录就可以了。

7、升级Nginx版本,执行如下命令:./upgrade_nginx.sh  按提示输入nginx的版本号,如1.0.10,版本号可以从http://nginx.org/en/download.html获取。

8、升级PHP版本,执行如下命令:./upgrade_php.sh 按提示输入php版本号,如5.3.6。
状态管理
LNMP状态管理: /root/lnmp {start|stop|reload|restart|kill|status}
Nginx状态管理:/etc/init.d/nginx {start|stop|reload|restart}
PHP-FPM状态管理:/etc/init.d/php-fpm {start|stop|quit|restart|reload|logrotate}
PureFTPd状态管理: /etc/init.d/pureftpd {start|stop|restart|kill|status}
MySQL状态管理:/etc/init.d/mysql {start|stop|restart|reload|force-reload|status}
Apache状态管理:/etc/init.d/httpd {start|stop|restart|graceful|graceful-stop|configtest|status}
Memcached状态管理:/etc/init.d/memcached {start|stop|restart}
相关图形界面程序
phpinfo : http://前面输入的域名或IP/phpinfo.php
phpMyAdmin : http://前面输入的域名或IP/phpmyadmin/
探针 : http://前面输入的域名或IP/p.php
PureFTP管理界面:http://前面输入的域名或IP/ftp/
Memcached测试页面:http://前面输入的域名或IP/memcached.php
LNMP相关目录
nginx : /usr/local/nginx
mysql : /usr/local/mysql
php : /usr/local/php
网站目录: /home/wwwroot/
Nginx日志目录:/home/wwwlogs/
Nginx虚拟主机配置文件所在目录:/usr/local/nginx/conf/vhost/
Apache虚拟主机配置文件所在目录:/usr/local/apache/conf/vhost/
LNMP相关配置文件
Nginx主配置文件:/usr/local/nginx/conf/nginx.conf
MySQL配置文件:/etc/my.cnf
PHP配置文件:/usr/local/php/etc/php.ini
php-fpm配置文件:/usr/local/php/etc/php-fpm.conf
PureFtpd配置文件:/usr/local/pureftpd/pure-ftpd.conf
PureFtpd MySQL配置文件:/usr/local/pureftpd/pureftpd-mysql.conf
Apache配置文件:/usr/local/apache/conf/httpd.conf
技术支持:
LNMP官网:http://www.lnmp.org/
技术交流及反馈论坛:http://bbs.vpser.net/forum-25-1.html

15个学习PHP的国外好站点推荐

在线教程永远都受到欢迎,本文列出15个国外学习PHP的好站点,分享给大家。这些站点包括很多的在线教程。列表如下:

1. PHP.net

clip_image001

2. PHP Builder

clip_image002

3. Deniweb Forum

clip_image003

4. W3Schools

clip_image004

5. Stack Overflow

clip_image005

6. PHP Edit

clip_image007

7. PHP Designer

clip_image009

8. Zend Studio

clip_image010

9. WikiBook’s PHP Books

clip_image011

10. PHP  Tutorials

clip_image012

11. Developer Tutorials

clip_image013

12. 9Lessons

clip_image014

13. Hot Scripts

clip_image015

14. PHP Freaks

clip_image016

15. Big Resouces

clip_image017

原文链接:15 Best Resources To Learn PHP Online

PHP v5.2.9 RC 3

PHP是一种新型的CGI程序编写语言,易学易用,运行速度快,可以方便快捷地编写出功能强大,运行速度快,并可同时运行于
Windows、Unix、Linux平台的Web后台程序,内置了对文件上传、密码认证、Cookies操作、邮件收发、动态GIF生成等功能,PHP
直接为很多数据库提供原本的连接,包括Oracle、Sybase、Postgres、Mysql、Informix、Dbase、Solid、
Access等,完全支持ODBC接口,用户更换平台时,无需变换PHP代码,可即拿即用。

更新:http://php.net/ChangeLog-5.php
官网:http://www.php.net/

v5.2.9 RC3:
Windows:http://windows.php.net/downloads/qa/php-5.2.9RC3-Win32-VC6-x86.zip
Linux:http://downloads.php.net/ilia/php-5.2.9RC3.tar.bz2
v5.3.0 Beta 1 官方下载:
Linux:http://downloads.php.net/johannes/php-5.3.0beta1.tar.bz2
Windows:http://windows.php.net/downloads/qa/php-5.3.0beta1-Win32-VC9-x86.zip

Eclipse PHP开发工具套件2.0发布

作者 Alex Blewitt 译者 霍泰稳

Eclipse基金会最近发布了PDT 2.0(PHP Development Toolset)交付的消息。这一PHP开发工具套件的重要更新,使得开发人员构建和部署PHP应用更加方便。

2.0这个更新里面有一些设计用来支持面向对象PHP编程的新特性,包括类型层次(和JDT里的类似)和类型,以及方法导航等。索引的速度也提升了许多,这要归功于底层的动态语言工具集(DLT,Dynamic Language ToolKit)。有意思的是DLT的社区参与者和PDT社区有很大的重叠,它也有许多基于PHP变量类型的高级代码辅助特性。

Eclipse执行总监Mike Milinkovich说:

PDT是Eclipse社区下载量最大的项目之一。自从第一次发布之日起,已经有超过100万次的下载量。很明显,PDT的采用在Eclipse和PHP社区都非常成功。

根据Eclipse下载页面的数据,PDT一直排在最受欢迎项目的前两位。PDT不仅是一个大型开源社区,它还构建了商业软件Zend Studio的基础。(Zend提供了一个对比列表,罗列了开源PDT和商业Zend Studio的异同点)。解释一下,Zend Studio是一个既能创建PHP又能创建JavaScript应用的富互联网应用开发IDE。

PDT 2.0基于Eclipse 3.4,PDT 2.1也已经在计划之中,会作为Galileo项目的一部分在6月份发布。

查看英文原文:Eclipse PHP Development Toolset 2.0 released

优秀的PHP程序员至少应该了解PHP代码的优缺点(转)

我在SitePoint做面试官的时候一定会问的问题是:你认为PHP代码的优劣体现在哪里?因为这个问题可以让我大体知道应聘者是哪种类型的程序
员,而不是单纯地考察他对PHP函数的掌握程度(这一点Zend的PHP认证做得不错,雅虎的PHP程序员面试题也属于此类)。重要的是,这个问题可以让
我知道应聘者是否经历过这样的事情——从一个懒散程序员手中接过一段凌乱的代码进行重用,或者要帮助团队中的其他成员来处理这类事情。

诚然,对于这个问题我自己也没有一个满意的答案,不过我知道哪些答案是我想听到的:

优秀的PHP代码应该是结构化的。大段的代码应该被分割整理成一个个函数或方法,而那些不起眼的小段代码则应该加上注释,以便日后清楚它们的用途。
而且应该尽可能地把前台代码如HTML、CSS、Javascript等从程序中分离出来。PHP的面向对象编程特性可以很好地帮助程序员将代码整理有
序。

优秀的PHP代码应该是规范化的。无论是为变量名和函数名设定命名规则,还是对一些会重复使用的过程如数据库操作和错误处理进行标准化,抑或是简单到规定好代码是怎样缩进的,这些规范化都可以让代码的可读性大大提高。

优良的PHP代码应该是自适应的。PHP有许多特性如magic quotes和short tags,这些特性的打开和关闭会影响到程序的运行。所以,一个好的程序员应该在他的代码中加入适当的语句来使程序能够根据环境进行调整。

优良的PHP代码应该是安全的。虽然PHP是一种高效、灵活的语言,没有固定的框架,但却把安全问题留给了程序员们。对潜在安全漏洞的深刻理解,如
跨站脚本攻击(XSS)、跨站请求伪造(CSRF)、代码注入漏洞、字符编码循环漏洞等,对于今天的专业程序员来说是至关重要的。

当应聘者在回答这些问题的时候,我就能清楚地知道是否该录用他。当然,有时程序员并不能很好地阐明这个问题,这时我们会让他们做一些PHP测试。测试中的许多问题表面上看起来非常简单,但这也给了应聘者们一个展现自我的机会,因为只要观察得仔细,就能找出问题。

下面这一小段“劣质”的PHP代码是一道简化了的测试题。这种问题就像在问:你该怎样优化这段代码?

这段代码的主要问题在于它把用户提交的数据直接显示到了网页上,从而产生XSS漏洞。其实有很多方法可以填补这个漏洞。那么,什么代码是我们想要的呢?

这是最低要求。XSS漏洞用htmlspecialchars函数填补了,从而屏蔽了非法字符。

能写出这样代码的人应该是我想要录用的人了:

可惜的是,能给出这样让人满意答复的程序员少之又少。我们花了3个月的时间才招聘到让我们满意的程序员.

那么,你会怎样回答文章开头提出的问题呢?你认为PHP代码的缺点体现在哪里?你认为一个PHP程序员还应具有哪些品质?