在javascript中使用php风格的$globals

 更新时间:2016年11月25日 16:11  点击:1648

在javascript中使用php风格的$globals

JavaScript有隐含的全局变量。当你不使用var来定义a = 1,而直接定义a=1时,这个变量a将成为一个全局变量。有的认为这是一个错误,应该避免全局变量,因为它们往往会在意想不到的地方出错,尤其是在项目参与人员很多的情况下。

在PHP当中,默认的是局部变量。如果你需要一个全局变量,那么你必须要将要声明为全局变量的变量放到$globals这个数组中。

怎样在javascripts中使用$globals呢?通过为全局公约在你的javascripts呢?在脚本文件顶部声明:
$GLOBALS = {};
那么每一次当你需要一个全局变量,您可以这样做:

$GLOBALS[ '' myglob '' ] = 1 ; / /非常像PHP的样式

或者如果你喜欢,也可以这样:

$globals.myglob = 1 ;
这样做的优点:

     *全局变量容易识别(甚至从飞机都可以看见)
     *如果变量不定义成$GLOBAL,那么它就是局部变量。如果变量没有使用var,那么它将产生一个错误

缺点:

     *这种使用方法,不是官方规定的,不强制使用,只是一项约定俗成的方法。

 

 

Stoyan Stefanov''s Blog: PHP-style $GLOBALS in Javascript?

Javascript has implied globals. When you skip the var in var a = 1; and go a = 1;, then a becomes a global variable. Some consider this an error in the language. Global variables should be avoided because they tend to overwrite each other in unexpected places, especially if the project grows in LOC and number of developers.
In PHP on the other hand, variables are local. If you need a global variable, then you have to have to be explicit about it using the $GLOBALS superglobal array.
So how about this: adopt the $GLOBALS convention in your JavaScripts? At the top of the script you go:
$GLOBALS = {};
Then every time you need a global variable, you do:
$GLOBALS[''myglob''] = 1; // very PHP-like
or if you prefer:
$GLOBALS.myglob = 1;
Benefits of the approach:
• global variables easy to spot (even from an aeroplane)
• if it''s not $GLOBAL, it''s meant to be local. If it''s missing the var, it''s an error
Drawback:
• It''s a convention, so it can only help, but not enforce any coding practices

1.如果一个方法可静态化,就对它做静态声明。速率可提升至4倍。

2.echo 比 print 快。

3.使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接。

4.在执行for循环之前确定最大循环数,不要每循环一次都计算最大值。

5.注销那些不用的变量尤其是大数组,以便释放内存。

6.尽量避免使用__get,__set,__autoload。

7.require_once()代价昂贵。

8.在包含文件时使用完整路径,解析操作系统路径所需的时间会更少。

9.如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。

10.函数代替正则表达式完成相同功能。

11.str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。

12.如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。

13.使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。

14.用@屏蔽错误消息的做法非常低效。

15.打开apache的mod_deflate模块。

16.数据库连接当使用完毕时应关掉。

17.$row[‘id’]的效率是$row[id]的7倍。

18.错误消息代价昂贵。

19.尽量不要在for循环中使用函数,比如for ($x=0; $x < count($array); $x)每循环一次都会调用count()函数。

20.在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。

21.递增一个全局变量要比递增一个局部变量慢2倍。

22.递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。

23.递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。

24.仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。

25.方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。

26.派生类中的方法运行起来要快于在基类中定义的同样的方法。

27.调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。

28.用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会。当然,只有当你不需要在字符串中包含变量时才可以这么做。

29.输出多个字符串时,用逗号代替句点来分隔字符串,速度更快。注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。

30.Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。

31.除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。

32.尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。

33.当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在 zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步 骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。

(举例如下)
if (strlen($foo) < 5) { echo “Foo is too short”; }
(与下面的技巧做比较)
if (!isset($foo{5})) { echo “Foo is too short”; }

调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。

PHP提供了使用其crypt()函数完成单向加密功能的可能性。
  string crypt (string input_string [, string salt])
  其中的input_string参数是需要加密的字符串,第二个可选的salt是一
个位字串,它能够影响加密的暗码,进一步地排除被称作预计算攻击的可能
性。缺省情况下,PHP使用一个2个字符的DES干扰串,如果你的系统使用的是
MD5,它会使用一个12个字符的干扰串。顺便说一下,可以通过执行下面的命
令发现系统将要使用的干扰串的长度:
    print "My system salt size is: ". CRYPT_SALT_LENGTH;
  系统也可能支持其他的加密算法。crypt()支持四种算法,下面是它支持
的算法和相应的salt参
数的长度:
  算法                      Salt长度
  CRYPT_STD_DES         2-character (Default)
  CRYPT_EXT_DES         9-character
  CRYPT_MD5              12-character beginning with $1$
  CRYPT_BLOWFISH        16-character beginning with $2$
  用crypt()实现用户身份验证
  作为crypt()函数的一个例子,考虑这样一种情况,你希望创建一段PHP
脚本程序限制对一个目录的访问,只允许能够提供正确的用户名和口令的用
户访问这一目录。我将把资料存储在我喜欢的数据库MySQL的一个表中。下面
我们以创建这个被称作members的表开始我们的例子:
mysql>CREATE TABLE members (
    ->username CHAR(14) NOT NULL,
    ->password CHAR(32) NOT NULL,
    ->PRIMARY KEY(username)
    ->);
  然后,我们假定下面的数据已经存储在该表中:
  用户名               密码
  clark          keloD1C377lKE
  bruce         ba1T7vnz9Awgk
  peter         paLUvRWsRLZ4U
  这些加密的口令对应的明码分别是kent、banner和parker。注意一下每
个口令的前二个字母,这是因为我使用了下面的代码,根据口令的前二个字
母创建干扰串的:
  $enteredPassword.
  $salt = substr($enteredPassword, 0, 2);
  $userPswd = crypt($enteredPassword, $salt);
  // $userPswd然后就和用户名一起存储在MySQL中
  我将使用Apache的口令-应答认证配置提示用户输入用户名和口令,一个
鲜为人知的有关PHP的信息是,它可以把Apache的口令-应答系统输入的用户
名和口令识别为$PHP_AUTH_USER和$PHP_AUTH_PW,我将在身份验证脚本中用
到这二个变量。

Smarty是php的半官方模板引擎,从其主页位置就可以看出。使用简单,功能强大,本文就介绍一下smarty模板的安装和使用。

1) 现在模板的安装包,解压到根目录外的某个位置,比如解压到c:phpLibsmarty

2)修改 php.ini文件,配置include_path。 如此文中的配置为:include_path="c:phpLibsmartylibs"

     注意,要把include_path前的分号去掉

3) 创建存放模板文件和配置文件的四个目录

       templates 存放模板文件的目录

      template_c 防止smarty编译的模板文件

      configs 放置专用的配置文件目录

       cache   在启用缓存的情况下,放置smarty缓存的所有文件

4)在php脚本使用smarty模板前,先制定上述四个目录的位置:

<?php

$smarty = new Smarty;
$smarty->template_dir = "templates";
$smarty->compile_dir = "template_c";
$smarty->config_dir = "configs";
$smarty->cache_dir = "cache";

?>

 

完成上述四个步骤后,就可以使用smarty模板了

 



第五章 Scaffolding (脚手架?)

Scaffolding是一个很棒的途径,使得早期开发的部分web应用能够运行起来。早期的数据库模式是不稳定的,很容易变化。Scaffolding有个下降趋势:web程序员憎恨创建以后可能根本用不到的forms。为了减少程序员的这种重复劳动, Cake中包含了ScaffoldingScaffolding分析数据库,创建一些标准的使用adddelete、和edit按钮的lists,创建输入的forms,以及查看数据库中一个item的标准views。为了在程序中的controller中添加Scaffolding,需要添加$scaffold变量:

 注意save操作是如何放置在一个条件语句中:如果你试图保存数据到model中,cake自动尝试确数据正确(根据你提供的规则)。可以查看第十章了解更多关于正确规则(validation).如果不想查看正确性直接保存数据,使用save($data,false);

 

    其他有用的保存方法:

●savaFieldId($name,$value)

    ○保存一个单field的值

●getLastInsertID()

○返回最近创建记录的ID

 

1.4 Model的Callbacks

    在我们接近0.10.x最终版的时候,我们添加了一些model的回调函数,允许用户能够逻辑上悄悄的在model操作前或操作后执行。为了在应用中获得这种方法,在model中使用提供的参数,重载下面的这些方法

●beforeFind($conditions)

○这个回调函数在一个查询操作开始之前执行。将查询前的操作逻辑放到这个方法里面。当你在model中重写(override)这个方法时,当你想要find操作执行时候返回true,当你想要执行中止时候返回false

●afterFind($results)

○使用这个回调函数可以修改从find操作中返回的结果,或者实现其他任何的find后逻辑。这个函数的参数是model的find操作的结果,返回的是修改后的结果。

●beforeSave()

○在这个函数中放置任何保存前的逻辑。如果你像保存操作执行则返回true,否则返回false

●afterSave()

    ○放置任何你想要在保存后执行的代码在这个回调函数中

●beforeDelete()

    ○放置删除前的逻辑代码。想要删除操作执行则返回true,否则返回false

●afterDelete()

    ○放置任何你想要在删除后执行的代码在这个回调函数中

 

2. Model 变量

    当你创建你的models时候,你可以设置一些特殊的变量,来获得对Cake函数的使用。

●$primaryKey

○如果这个model关联到一个数据库的table,而且数据库的主键并不是id,那么使用这个变量来告诉Cake主键的名字

●$transactional

○告诉Cake该model是否支持传输(举例 begin/commit/rolback),设置为boolea值。

●$useTable

○如果你想使用的数据库的table并不是model名的复数形式,而且你也不想改变table名,设置这个变量为table名

●$validate

    ○确认传递给model的数据是否正确的一个数组。查看第十章

●$useDbConfig

○还记得数据库设置中,你可以在/app/config/database.php文件中设置么?使用这个变量可以交换他们

 


class CategoriesController extends AppController
{
    var $scaffold
;
}

有关Scaffold,要注意一个重要的问题: Scaffold期望每个以_id结尾的filed name是一个外键并且指向一个tabletable的名称和_id前方的一样(只不过是小写的)。所以,举个例子来说,如果你嵌套了分类,你最好有个列叫做parent_id。在这个版本中,最好能够命名为parentid.同样,在表中有一个外键(比如,titles table有个category_id,并且你已经合适的联结到models(查看6.2理解联结),在show/edit/newdviews中,选择的表将会和外键的表(category)一起自动的表现出来(原文:a select box will be automatically populated with the rows from the foreign table (category) in the show/edit/new views.)。在foreign model中设置$displayField来决定foreign中哪些field会被显示。继续我们的例子,category有个标题
class Title extends AppModel 
{
    var $displayField 
= ''title'';
}

第六章 Models

本章内容:

1. Model Function

       1.1 用户定义的Function

       1.2 检索(retrieving)你的数据

       1.3 保存你的数据

       1.4 Model的回调(callbacks

2. Model的变量

3. Associations

 

Model是什么,它是MVC模式中的M

Model做些什么。它使得domain logicpresentation分隔开,独立application logic(It separates domain logic from the presentation, isolating application logic.)

      

       一个Model概要的说就是一个指向数据库的access,更具体,就是数据库中的特定的table。默认的,每个model都使用自身名字复数形式的table,比如,User Mode使用 users

tableModels可以维护数据特定的规则,联结信息以及它使用的table的方法。

 

 

1. Model的方法

       PHP的观点看,models都是从AppModel类继承来的类。类AppModel原始是定义在 /cake目录下。你也可以创建自己的放在 app/app_model.php.这个文件应该包含一些可供多个models共享的方法。AppModel本身也是从Model类继承而来的,Model类是一个标准的Cake库,定义在 libs/model.php

       注意

       虽然本节介绍的是Model中常用的方法,然而记住:更详细的参考请到http://api.cakephp.org

 

1.1 用户定义的方法

       下面是model中一个特定table的例子,该例子实现了在blog中显示和隐藏两种方法

6.1  Example Model Functions


<?php
class Post extends AppModel
{
   function hide ($id
=null)
   {
      if ($id) $this->setId($id)
;
      $this->set(''hidden'', ''1'');
      $this->save();
   }
 
   function unhide ($id
=null)
   {
      if ($id) $this->setId($id)
;
      $this->set(''hidden'', ''0'');
      $this->save();
   }
}
?>

1.2 检索数据

下面是使用model得到数据的一些标准方法

findAll($conditions,$fields,$order,$limit,$page,$recursive)

○返回特定的fieldsfields$limit(默认是50)个记录,匹配$conditions(如果有),从第$page(默认1)页开始列表,$conditions内容应该像SQL语句中的一样,比如:$conditions=”race = ‘wookie’ AND thermal_detonators>3”

○当$recursive选项设置成13的整数,findAll()将会试图返回在联结到该model中发现的所有项的models.这项递归寻找可以深入3层。

find($conditions, $fields, $order, $recursive)

    ○返回匹配$conditions的第一条记录的制定的fields(如果没有指定则返回全部)

    $recursive作用同上

findAllBy<FieldName>($value) and findBy<FieldName>($value)

○这些奇妙的方法可以用于指定特定的field和特定的value快速查找行,你要做的就是把你的field用驼峰表达法添加在后面。举个例子(用于controller中)


$this->Post->findByTitle(''My First Blog Post'');
$this->Author->findByLastName(''Rogers'');
$this->Property->findAllByState(''AZ'');
$this->Specimen->findAllByKingdom(''Animalia'');

返回的结果是一个数组,和find()以及findAll()返回的结果是一个形式

field($name,$conditions,$order)

○根据$order排序,根据条件$conditions,将第一条记录中的field值,作为string返回

findCount($conditions)

    ○返回匹配$conditions的记录的个数

generateList

($conditions=null,$order=null,$limit=null,$keyPath=null,$valuePath=null)

    ○根据modelslists,得到一系列key的值,特别是根据model list创建<select>list$conditions, $order, $limit参数使用方法和上面相同。$keyPath$valuePath是你告诉model那里去找keysvalues来成list。举个例子,基于Role model,你想生成一个由ids(类型integer)当作key,由roles当作valuelist,这个方法调用形式如下:


$this->set(
    ''Roles''
,
    $this->Role->generateList(null
, ''role_name ASC'', null, ''id'', ''role_name'')
)
;

//This would return something like:
array(
    ''
1'' => ''Account Manager'',
    ''
2'' => ''Account Viewer'',
    ''
3'' => ''System Manager'',
    ''
4'' => ''Site Visitor''
)
;

read($fields=null, $id=null)

    ○使用这个方法从当前装载的记录或者由$id指定的记录中得到fields和值

 

 

    特定的Sql调用可以使用modelfindBySql()方法。举例,在blog应用中,我想存储一个发贴者的first name到一个table中,但是这个table并不是我的cake schema中的一部分。我就可以通过这个model中的一个特定的方法

 

6.2 Custom Sql Calls With findBySql()


<?php
class Post extends AppModel
{
        function posterFirstName()
        {
          $ret 
= $this->findBySql("SELECT first_name FROM posters_table 
                                   WHERE poster_id = 1
");
          $firstName = $ret[0][''first_name''];
          return $firstName;
        }
}
?>

当然也有query()方法,如果执行成功返回true,失败返回false。因为query语句并不是都返回结果集。比如“DELETE FROM problems WHERE solved = true

 

1.3 保存数据

    为了保存你的数据到model中,你应该向model提供你想要保存的数据。这些数据提交给save()方法应该以下面的形式保存


Array
(
    
[modelname] => Array
        (
            
[fieldname1] => value
            
[fieldname2] => value
        )
)

   

form表单提交(post方法)的数据会自动排列成这种形式,并且放置到controller中的$this->params[‘data’],因此,通过webform表单保存数据非常简单。一个controller的编辑方法可能会像下面这样显示:



function edit($id) 
{
   //Note: The property model is automatically loaded for us at $this->property.     
   // Check to see if we have form data 
   if (isset($this->params
[''form''][''data''][''property''])) 
   {  
      // Here''s where we try to save our data
      if ($this->property->save($this->params
[''data''])) 
      {
         //Show the user that her data has been saved
         $this->flash(''Your information has been saved.''
,            
 ''/properties/edit/''.$this->params
[''data''][''property''][''id''], 2);
         exit();
      }
      else
      {
         //If the data couldn''t be validated
, show the validation errors
         //and repopulate form fields with submitted data
         $this->set(''form''
, $this->params[''data'']);
         $this->validateErrors($this->property);
         $this->render();
      }      
   }   
   //If no form data was submitted
, just render the edit view
   $this->render()
;
}

 

<
[!--infotagslink--]

相关文章

  • 使用PHP+JavaScript将HTML页面转换为图片的实例分享

    这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下...2016-04-19
  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • 关于JavaScript中name的意义冲突示例介绍

    在昨天的《Javascript权威指南》学习笔记之十:ECMAScript 5 增强的对象模型一文中,对于一段代码的调试出现了一个奇怪现象,现将源代码贴在下面: 复制代码 代码如下: <script type="text/javascript"> function Person(){}...2014-05-31
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • javascript自定义的addClass()方法

    复制代码 代码如下: //element:需要添加新样式的元素,value:新的样式 function addClass(element, value ){ if (!element.className){ element.className = value; }else { newClassName = element.className; newClas...2014-05-31
  • ps怎么使用HSL面板

    ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。 &#8195;...2017-07-06
  • JavaScript中的this关键字使用方法总结

    在javascritp中,不一定只有对象方法的上下文中才有this, 全局函数调用和其他的几种不同的上下文中也有this指代。 它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。JavaScript 中函数的调用有以下...2015-03-15
  • 详解javascript数组去重问题

    首先,我想到的是另建一个结果数组,用来存储原始数组中不重复的数据。遍历原始数组依次跟结果数组中的元素进行比较,检测是否重复。于是乎,我写出了如下代码A: Array.prototype.clearRepetitionA = function(){ var resul...2015-11-08
  • JavaScript预解析,对象详解

    这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
  • javascript的事件触发器介绍的实现

    事件触发器从字面意思上可以很好的理解,就是用来触发事件的,但是有些没有用过的朋友可能就会迷惑了,事件不是通常都由用户在页面上的实际操作来触发的吗?这个观点不完全正确,因为有些事件必须由程序来实现,如自定义事件,jQue...2014-06-07
  • JavaScript中逗号运算符介绍及使用示例

    有一道js面试题,题目是这样的:下列代码的执行结果是什么,为什么? 复制代码 代码如下: var i, j, k; for (i=0, j=0; i<10, j<6; i++, j++) { k = i+j; } document.write(k); 答案是显示10,这道题主要考察JavaScript的逗...2015-03-15
  • JavaScript学习笔记整理_setTimeout的应用

    下面小编就为大家带来一篇JavaScript学习笔记整理_setTimeout的应用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-03
  • Javascript类型转换的规则实例解析

    这篇文章主要介绍了Javascript类型转换的规则实例解析,涉及到javascript类型转换相关知识,对本文感兴趣的朋友一起学习吧...2016-02-27
  • 详解JavaScript操作HTML DOM的基本方式

    通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素。 HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。 HTML DOM 模型被构造为对象的树: 通过可编程的对象模型,Java...2015-10-23
  • ActiveX控件与Javascript之间的交互示例

    1、ActiveX向Javascript传参 复制代码 代码如下: <script language="javascript" for="objectname" event="fun1(arg)"> fun2(arg); </script> objectname为ActiveX控件名,通过<object>标签里的id属性设定,如下; 复制...2014-06-07
  • JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍

    下面小编就为大家带来一篇JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-05-20
  • JavaScript获取浏览器信息的方法

    Window有navigator对象让我们得知浏览器的全部信息.我们可以利用一系列的API函数得知浏览器的信息.JavaScript代码如下:function message(){ txt = "<p>浏览器代码名: " + navigator.appCodeName + "</p>";txt+= "<p>...2015-11-24
  • 学习JavaScript设计模式之装饰者模式

    这篇文章主要为大家介绍了JavaScript设计模式中的装饰者模式,对JavaScript设计模式感兴趣的小伙伴们可以参考一下...2016-01-21
  • javascript设计模式之解释器模式详解

    神马是“解释器模式”?先翻开《GOF》看看Definition:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。在开篇之前还是要科普几个概念: 抽象语法树: 解释器模式并未解释如...2014-06-07
  • Plesk控制面板新手使用手册总结

    许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10