Apache下设置反向代理的方法
需要在Apache中开启反向代理模块
1 LoadModule proxy_module modules/mod_proxy.so
2 LoadModule proxy_http_module modules/mod_proxy_http.so
<VirtualHost *:80>
ServerName 127.0.0.255
ServerAlias
ErrorLog logs/iis.log
CustomLog logs/iis.access.log common
ProxyPass / http://www.lrxin.com/
ProxyPassReverse / http://www.lrxin.com/
</VirtualHost>
ProxyPass与ProxyPassReverse及ProxyPassMatch的概述
这几个都是APACHE的代理指令:
1、ProxyPass:
语法:ProxyPass [path] !|url
它主要是用作URL前缀匹配,不能有正则表达式,它里面配置的Path实际上是一个虚拟的路径,在反向代理到后端的url后,path是不会带过去的,使用示例:
1)、ProxyPass /images/ !
这个示例表示,/images/的请求不被转发。
2)、ProxyPass /mirror/foo/ http://backend.example.com/
我们假设当前的服务地址是http://example.com/,如果我们做下面这样的请求:
http://example.com/mirror/foo/bar
那将被转成内部请求:
http://backend.example.com/bar
注:配置的时候,不需要被转发的请求,要配置在需要被转发的请求前面。
2、ProxyPassMatch:
语法:ProxyPassMatch [regex] !|url
这个实际上是url正则匹配,而不是简单的前缀匹配,匹配上的regex部分是会带到后端的url的,这个是与ProxyPass不同的。使用示例:
1、ProxyPassMatch ^/images !
这个示例表示对/images的请求,都不会被转发。
2、ProxyPassMatch ^(/.*\.gif)$ http://backend.example.com$1
这个示例表示对所有gif图片的请求,都被会转到后端,如此时请求http://example.com/foo/bar.gif,那内部将会转换为这样的请求http://backend.example.com/foo/bar.gif。
3、ProxyPassReverse
语法:ProxyPassReverse [路径] url
它一般和ProxyPass指令配合使用,此指令使Apache调整HTTP重定向应答中Location, Content-Location, URI头里的URL,这样可以避免在Apache作为反向代理使用时,。后端服务器的HTTP重定向造成的绕过反向代理的问题。参看下面的示例:
ProxyPass /example http://www.example.com/
ProxyPassReverse /example http://www.example.com/ProxyPassReverse的作用就是反向代理,如果没有加这样的反向代理设置的情况下,访问http://www.test.com/example/a,如果www.example.com对请求进行了redirect至http://www.example.com/b,那么,客户端就会绕过反向代理,进而访问http://www.test.com/example/b。如果设置了反向代理,则会在转交HTTP重定向应答到客户端之前调整它为http://www.test.com/example/a/b,即是在原请求之后追加上了redirect的路径。
php curl_init函数用法
使用PHP的cURL库可以简单和有效地去抓网页。你只需要运行一个脚本,然后分析一下你所抓取的网 页,然后就可以以程序的方式得到你想要的数据了。无论是你想从从一个链接上取部分数据,或是取一个XML文件并把其导入数据库,那怕就是简单的获取网页内 容,cURL 是一个功能强大的PHP库。
PHP中的CURL函数库(Client URL Library Function)
curl_close — 关闭一个curl会话
curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数
curl_errno — 返回一个包含当前会话错误信息的数字编号
curl_error — 返回一个包含当前会话错误信息的字符串
curl_exec — 执行一个curl会话
curl_getinfo — 获取一个curl连接资源句柄的信息
curl_init — 初始化一个curl会话
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源
curl_multi_close — 关闭一个批处理句柄资源
curl_multi_exec — 解析一个curl批处理句柄
curl_multi_getcontent — 返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的curl的相关传输信息
curl_multi_init — 初始化一个curl批处理句柄资源
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select — Get all the sockets associated with the cURL extension, which can then be “selected”
curl_setopt_array — 以数组的形式为一个curl设置会话参数
curl_setopt — 为一个curl设置会话参数
curl_version — 获取curl相关的版本信息
curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。
例子一: 基本例子
基本例子
﹤?php
// 初始化一个 cURL 对象
$curl = curl_init();
// 设置你需要抓取的URL
curl_setopt($curl, CURLOPT_URL, ‘http://www.cmx8.cn’);
// 设置header
curl_setopt($curl, CURLOPT_HEADER, 1);
// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
// 运行cURL,请求网页
$data = curl_exec($curl);
// 关闭URL请求
curl_close($curl);
// 显示获得的数据
var_dump($data);
?>
例子二: POST数据
sendSMS.php,其可以接受两个表单域,一个是电话号码,一个是短信内容。
POST数据
﹤?php
$phoneNumber = ’13812345678′;
$message = ’This message was generated by curl and php’;
$curlPost = ’pNUMBER=’ . urlencode($phoneNumber) . ’&MESSAGE=’ . urlencode($message) . ’&SUBMIT=Send’;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, ’http://www.lxvoip.com/sendSMS.php’);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
$data = curl_exec();
curl_close($ch);
?﹥
例子三:使用代理服务器
使用代理服务器
﹤?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, ’http://www.cmx8.cn’);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($ch, CURLOPT_PROXY, ’proxy.lxvoip.com:1080′);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, ’user:password’);
$data = curl_exec();
curl_close($ch);
?﹥
例子四: 模拟登录
Curl 模拟登录 discuz 程序,适合DZ7.0,将username改成你的用户名,userpass改成你的密码就可以了.
Curl 模拟登录 discuz 程序
<?php
!extension_loaded(‘curl’) && die(‘The curl extension is not loaded.’);
$discuz_url = ‘http://www.lxvoip.com’;//论坛地址
$login_url = $discuz_url .’/logging.php?action=login’;//登录页地址
$get_url = $discuz_url .’/my.php?item=threads’; //我的帖子
$post_fields = array();
//以下两项不需要修改
$post_fields[‘loginfield’] = ‘username’;
$post_fields[‘loginsubmit’] = ‘true’;
//用户名和密码,必须填写
$post_fields[‘username’] = ‘lxvoip’;
$post_fields[‘password’] = ‘88888888’;
//安全提问
$post_fields[‘questionid’] = 0;
$post_fields[‘answer’] = ”;
//@todo验证码
$post_fields[‘seccodeverify’] = ”;
//获取表单FORMHASH
$ch = curl_init($login_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec($ch);
curl_close($ch);
preg_match(‘/<input\s*type=”hidden”\s*name=”formhash”\s*value=”(.*?)”\s*\/>/i’, $contents, $matches);
if(!empty($matches)) {
$formhash = $matches[1];
} else {
die(‘Not found the forumhash.’);
}
//POST数据,获取COOKIE
$cookie_file = dirname(__FILE__) . ‘/cookie.txt’;
//$cookie_file = tempnam(‘/tmp’);
$ch = curl_init($login_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_exec($ch);
curl_close($ch);
//带着上面得到的COOKIE获取需要登录后才能查看的页面内容
$ch = curl_init($get_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
$contents = curl_exec($ch);
curl_close($ch);
var_dump($contents);
php换行符PHP_EOL变量的使用
PHP_EOL 是php的一个常量,他表代表换行符。
一个小小的换行,其实在不同的平台有着不同的实现,为什么要这样,可以是世界是多样的。本来在unix世界换行就用/n来代替,但是windows为了体现他的不同,就用/r/n,更有意思的是在mac中用/r。因此unix系列用 /n,windows系列用 /r/n,mac用 /r,这样就用你写的程序在不同的平台上运行有着不少的麻烦。
为了避免编写的程序在不同的平台下 换行符不同意 建议换行符使用 php常量 PHP_EOL
例如“去除换行符”;
$str = str_replace(PHP_EOL, ”, $str);
Maximum execution time of 30 seconds exceeded
Maximum execution time of 30 seconds exceeded 错误解决方案.
简单总结一下解决办法:
报错一:内存超限,具体报错语句忘了,简单说一下解决办法。
利用循环分批导入;
每个循环内部开始处使用sleep(5);语句,做延迟执行,防止服务器内存同一时间占用过多,里面数字据情况修改;
每个循环内部结束地方使用 ob_flush();刷新输出缓冲
flush();将当前为止程序的所有输出发送到用户的浏览器
两者必须同时使用来刷新输出缓冲
报错二:30秒运行超时的错误(Maximum execution time of 30 seconds exceeded)
解决办法:
方法一,修改php.ini文件
max_execution_time = 30; Maximum execution time of each script, in seconds
把它设置成需要的值就可以了。如果设置成0的话,就是永不过期。
方法二,修改php执行文件
加上
<?
set_time_limit(0);
?>
max_execution_time = 30; Maximum execution time of each script, in seconds
把它设置成需要的值就可以了。如果设置成0的话,就是永不过期。
dedecms用artlist调用附表中的字段
{dede:arclist addfields=’body’ row=’8′ channelid=’1′ row=1 }
[field:body /]<br />
{/dede:arclist}
这个标签使用有两个条件
1、指定channelid 属性
2、指定要获得的字段addfields=’字段1,字段2′
WordPress垃圾评论的处理方法
使用WordPress的朋友相信都受过垃圾评论的骚扰,半个月没有登录自己的WordPress今天一上来,发现由6万多条垃圾评论。去数据库用sql语句清理了下。然后上网搜索了WordPress垃圾评论的处理方法。发现方法大致有三种
方法一、使用WordPress插件删除所有待审核评论
这种方法呢,每次也都是手动在后台批量将所有待审核的评论都删除掉,旧的评论都会被保留,但真实的待审评论也一样被删除掉了。不喜欢。
方法二、使用Akismet智能识别删除所有垃圾评论
Akismet是一款WordPress博客系统上很出名的反垃圾评论系统,博客可以使用它扫描并删除所有的垃圾评论。这种方法要比第一种方法智能,很多网站推荐。不过好像是付费的。不喜欢。
方法三、使用phpMyAdmin进入MySql数据库删除所有垃圾评论
这个也是最万能的,不过每次登录phpMyAdmin比较麻烦。一次删除所有带审核的评论的sql是:
DELETE FROM wp_comments WHERE comment_approved = ‘0’
这个方法是我无奈的时候常用的。
之前写过 修改 评论文件路径的方法,可以屏蔽机器人发布评论。不过试了好些也不好用,现在的机器人也智能了。
最后没有其他办法,自己想象结局办法。分析一下垃圾评论,大都是通过机器人发布的。且内容部分都包含连接地址。想想可不可以在评论程序屏蔽所有内容中带连接地址的评论,尽管一刀切,但很有效。
方法:
1.找到文件 wp-comments-post.php 用dw打开。
找到 require( dirname(__FILE__) . ‘/wp-load.php’ );
在它下班加入如下代码:
if( preg_match_all(‘#http:\/\/.+#’,strtolower( $_POST[‘comment’] ) , $matches) ){
wp_die( “留言中不可以有连接地址!!!” );
exit;
}
如下图:
之后,再有人在评论中加入 连接地址
就会提示 留言中不可以有连接地址!!! 连接内容也不会呗写入数据库了。如下图:
当然你可可以自己写更好的正则规则来过滤垃圾评论。
CI让控制器可以支持多级子目录的扩展Router类库
ci控制器 只可以在application/controllers目录下创建文件夹并放入你的控制器,这里ci框架只支持在application/controllers目录下创建一级目录,不支持多级子目录。
这样在做一些打项目的时候,不能建立多级的目录URL结构,这样由很大的局限性。如何解决这个问题呢?
访问的方式就是 index.php/目录1/目录2/目录3/控制器/方法/参数
下载MY_Router.php 文件 放到 application\core 文件夹下 就可以了
MY_Router.php 下载地址:
http://pan.baidu.com/share/link?shareid=3233428789&uk=1010090726
CodeIgniter 通过ODBC连接 SqlServer的方法实例
我们都知道PHP跟MySql是最佳拍档,但是有些时候,出于种种原因,还是需要让PHP连接一下其他数据库的,比如微软的SQL Server。原生的PHP本身也提供了各种函数连接SQL Server,包括直连或通过ODBC连接。不过现在开发PHP项目很少不用框架,国内来讲,CodeIgniter这个开源框架因为架构清晰,文档丰富,所以很容易上手快,
而这次将要描述的就是在CodeIgniter 框架下,如何通过ODBC连接SQL Server数据库。
可能有人会问了,为啥不直连SQL Server,偏要绕道ODBC呢? 其实我不相瞒,要是能痛痛快快的直连上SQL Server我也就不用舍近求远走ODBC了。当时是想直连来着,不过没搞定,走ODBC则成功了。其实,通过ODBC连SQL Server还有一个好处是,ODBC是一个通用的数据库连接接口,它并不关注要连接的数据库的实例是什么类型或什么版本,因此,只要你的代码连接上了ODBC,理论上你就可以通过ODBC的系统DSN得到任何你想要的其他数据库连接实例,而不需要对你的代码进行太多改写。本着实用主义的原则,既然通过ODBC能连上,那么我就来总结一下连接的步骤。
首先介绍一下我的运行环境:
• wamp 的apache,php,MySql集成安装环境
• CodeIgniter 2.02版
• Microsoft SQL Server 2008 Express版(当然正式版的更好)
• Windows7 操作系统
第一步:SQL Server 2008连接到ODBC
这里罗嗦一句,要保证SQL Server 2008 Express能正常连接到ODBC,先看一下是否已经开启了SQL Server网络配置里的TCP/IP。Express版这里是默认关闭的,正式版这里默认就是开启状态,所以没这个问题。
设置ODBC的系统DSN,在ODBC数据管理器中新建一个系统DSN,名称叫test1,服务器是localhost,我是连接本机的Sql Server服务。
下一步,输入SQL Server的用户名密码,我用的是SQL Server验证:
填入SQL Server的用户名密码之后要求选择默认的数据库,在下一步点击完成,然后测试一下这个连接:
点击测试数据源,之后提示你测试成功,ODBC到SQL Server的连接就建立好了。然后我们得到了这个系统DSN:
第二步: CodeIgniter配置和连接ODBC:
为能连上ODBC数据源,CI的数据库配置文件database.php需配置如下:
$db['default']['hostname'] = 'test1'; $db['default']['username'] = 'sa'; $db['default']['password'] = '123456'; $db['default']['dbdriver'] = 'odbc'; $db['default']['dbprefix'] = ''; $db['default']['pconnect'] = TRUE; $db['default']['db_debug'] = TRUE;
说明:hostname是系统DSN的名字,username是SQL Server超管名字,password的123456是其超管密码,表前缀我保持为空,最后两个参数pconnect和db_debug,以及我没列出来的其他参数,对于是否能连接成功来讲,都无关紧要,我不确认是否有必要填写。而且我提供的这个配置方案,一方面是可以连接到ODBC的,另一方面,对于玩儿法很多的CI来讲,可以肯定不是唯一可行的面向ODBC的配置,只是给大家提供一个实例,有兴趣大家可以另行寻找可行的配置。
好的,现在配置文件完成了。
第三步:修改CodeIgniter源文件:
为了让上述配置文件能够连接成功ODBC,有个源文件必须修改,我并不确认这是否是CI的一个bug,不过,不修改就无法连接,修改了就可以连接上,且没发现有什么问题。
要修改的是system\database\drivers\odbc\odbc_driver.php这个文件,需要屏蔽掉下述代码:
function CI_DB_odbc_driver($params) { parent::CI_DB($params); $this->_random_keyword = ' RND('.time().')'; // database specific random keyword }
你也可以先不屏蔽,直到最后连接时,若出现报错,再回过头来找到这个文件进行这步操作。
这个解决方案也是从CI英文官网论坛上找到的一个解决办法。
第三步:编写代码连接ODBC:
作为一个例子,我们直接在控制器进行编码,不涉及视图和模型,新建一个控制器叫testodbc.php,控制器代码如下:
<!--?php class testodbc extends CI_Controller { //put your code here public function __construct() { parent::__construct(); } public function connect(){ $this--->load->database(); $sql = "SELECT ID,Title,convert(text,Content)as Content,Aboutusorder FROM dbo.Aboutus"; $query = $this->db->query($sql); $result = $query->result_array(); foreach($result as $value){ var_dump($value); } } } ?>
上面要注意两点:
○ sql语句中将content字段的数据类型显示转换成了text类型。如果你的表中有字段不经过此转换,直接读取中文出现乱码的话,可尝试此转换。
○ 使用result_array(),而不是result(),来得到数据集的内容。
好了,现在执行你的这个控制器http://localhost/index.php/testodbc/connect/,你应该可以看到输出结果了!
php 程序中 改变session存储路径
$sessSavePath = dirname(__FILE__).”/../cache/sessions/”;
if(is_writeable($sessSavePath) && is_readable($sessSavePath))
{
session_save_path($sessSavePath);//重点 改变session存储路径
}
CodeIgniter: 帮助你编写 Web 应用程序的敏捷开源 PHP 框架
CodeIgniter 是一套给 PHP 网站开发者使用的应用程序开发框架和工具包。它提供一套丰富的标准库以及简单的接口和逻辑结构,其目的是使开发人员更快速地进行项目开发。使用 CodeIgniter 可以减少代码的编写量,并将你的精力投入到项目的创造性开发上。
CodeIgniter 就是你所需要的,如果…
- 你想要一个小巧的框架。
- 你需要出色的性能。
- 你需要广泛兼容标准主机上的各种 PHP 版本和配置。
- 你想要一个几乎只需 0 配置的框架。
- 你想要一个不需使用命令行的框架。
- 你想要一个不需坚守限制性编码规则的框架。
- 你不希望被迫学习一门模板语言(虽然可以选择你喜欢的模板解析器)。
- 你不喜欢复杂,热爱简单。
- 你需要清晰、完整的文档。
官方网站:http://codeigniter.org.cn/
使用手册:http://codeigniter.org.cn/user_guide/index.html
CodeIgniter_2.1.3.zip下载:http://pan.baidu.com/share/link?shareid=432131&uk=1010090726
CodeIgniter中文手册 .CHM:http://pan.baidu.com/share/link?shareid=432136&uk=1010090726
50点引入缓存提高PHP编程效率的经验
1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。
2、$row[’id’] 的速度是$row[id]的7倍。
3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。
4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。
5、注销那些不用的变量尤其是大数组,以便释放内存。
6、尽量避免使用__get,__set,__autoload。
7、require_once()代价昂贵。
8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。
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、错误消息代价昂贵。
18、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。
19、递增一个全局变量要比递增一个局部变量慢2倍。
20、递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。
21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。
22、仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。
23、方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。
24、派生类中的方法运行起来要快于在基类中定义的同样的方法。
25、调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。
26、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。
27、除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。
28、尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。
29、当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用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()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。
30、当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。
31、并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。
32、并非要用类实现所有的数据结构,数组也很有用。
33、不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?
34、当你需要时,你总能把代码分解成方法。
35、尽量采用大量的PHP内置函数。
36、如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。
37、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。
38、mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。
39、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;
40、尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;
41、优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过);
42、尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);
43、循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);
44、多维数组尽量不要循环嵌套赋值;
45、在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;
46、foreach效率更高,尽量用foreach代替while和for循环;
47、用单引号替代双引号引用字符串;
48、“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;
49、对global变量,应该用完就unset()掉;
50、用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。
dedecms模板制作——flag的使用
在文章列表页 想根据 自定义属性 flag 来给列表中的文章加上对应标签的方法
[field:flag runphp=’yes’]
if( preg_match(“#h#”,@me) ){@me =’头条’;}
else if( preg_match(“#c#”,@me) ){@me =’推荐’;}
else if( preg_match(“#f#”,@me) ){@me =’幻灯片’;}
/* … 更多… */
else{ @me=”;}
[/field:flag]
Maximum execution time of 30 seconds exceeded故障解决办法
Maximum execution time of 30 seconds exceeded错误。
从字面上就可以理解“最大执行时间超过30秒”,那应该就是APACHE或者PHP的执行时间设置的问题。
方法一,修改php.ini文件
max_execution_time = 30; Maximum execution time of each script, in seconds
在PHP.INI中找到一个参数:max_execution_time 最大执行时间。
将后面的值调大,然后重新启动APACHE服务,就OK了。
ps:把它设置成需要的值就可以了。如果设置成0的话,就是永不过期。
=====================================================
方法二,修改php执行文件
加上
<?
set_time_limit(0);
?>
=====================================================
ps:
但这不是根本的解决之道,根本解决,我觉得应该再优化一下我的数据处理算法,减少数据计算时间。
因为最近工作很忙,工作很多,千头万绪的,实在抽不出时间来重新设计算法,所以就只好先用这下解决方案代替一下下。
No data was received to import…MYSQL数据库过大问题的完美解决方法
用phpmyadmin导入大数据库的时候经常出现:
No data was received to import. Either no file name was submitted, or the file size exceeded the maximum size permitted by your PHP configuration. See FAQ 1.16.
这是因为php无法上传大文件照成的,解决这个问题可以有2中方法:
方法一:修改php上传文件的大小限制
首先检查php.ini配置文件中的以下三个变量
upload_max_filesize,
memory_limit ,
post_max_size,
初始大小分别为2M,8M,8M,修改的数字尽量大于原来的数字,但不可过大,以防占用服务器资源。
修改了以上三个在php.ini中的值以后,重启了Apache,再次打开phpmyadmin导入时,虽然phpmyadmin还是显示导入最大限制:20,48KB,但是导入大的数据库文件已经能成功了。
该方法本人不推荐,因为这样有的时候即使你修改了上传文件大小限制,也会因为上传时间过长而失败.
——————————————————–
方法二:修改phpmyadmin 配置 ,让phpmyadmin从服务器选择sql文件。
具体操作过程如下:
1.在 phpmyadmin目录里新建一个目录 upload.
2.打开phpmyadmin,找到config.inc.php文件,打开在里面修改 $cfg[‘UploadDir’] = “upload”; 然后保存
3.用 FTP软件上传需要导入的sql 文件到 phpmyadmin/upload/ 下
4.访问 phpmyadmin,点击 Import(导入) ,就会出现选择服务器上的文件的下拉框,选择刚才用FTP上传的SQL文件。
至此完美解决。