<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>潘锦的空间 &#187; PHP优化</title>
	<atom:link href="https://www.phppan.com/tag/php%e4%bc%98%e5%8c%96/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.phppan.com</link>
	<description>SaaS SaaS架构 团队管理 技术管理 技术架构 PHP 内核 扩展 项目管理</description>
	<lastBuildDate>Sun, 10 May 2026 02:26:45 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>PHP优化建议</title>
		<link>https://www.phppan.com/2011/03/optimizing-php/</link>
		<comments>https://www.phppan.com/2011/03/optimizing-php/#comments</comments>
		<pubDate>Wed, 23 Mar 2011 01:40:17 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP优化]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=1318</guid>
		<description><![CDATA[这是在 Google Code 下的 “Let’s make the web faster” 网站中一篇名为  [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-indent: 2em;">这是在 Google Code 下的 “Let’s make the web faster” 网站中一篇名为 <a style="color: #1299da; text-decoration: underline;" href="http://code.google.com/intl/zh-CN/fspeed/articles/optimizing-php.html">&lt;&lt; PHP performance tips &gt;&gt;</a>的文章。 这篇文章曾经引起PHP界的一些讨论，因为作者是Google的人。现在这篇文章做了一些修改。</p>
<ol>
<li>优化代码瓶颈</li>
<li>升级PHP版本</li>
<li>使用缓存</li>
<li>使用输出缓冲</li>
<li>避免写那些傻傻的set和get方法</li>
<li>不要随意复制变量</li>
<li>不要在循环中使用SQL查询</li>
</ol>
<p style="text-indent: 2em;">下面我们详细说说这些优化建议：</p>
<p style="text-indent: 2em;"><strong>1. 优化代码瓶颈</strong></p>
<p style="text-indent: 2em;">这是一个放之四海皆准的建议，对于代码优化来说，关键是找那些卡住了代码喉咙的那段代码，把瓶颈找到了，整个性能也许会有数据量级的提升。 或者换一个思路，优化那些执行次数多的代码，这里一点的优化可能给你惊喜。 代码瓶颈是什么呢？空间复杂度，时间复杂度，或者我们需要改变的是整个数据结构，或者我们最需要改变的是需求， 在某个不经意间，对于一些需求的把握不到位，可能会导致整个代码实现方案的低效率。</p>
<p style="text-indent: 2em;"><strong>2. 升级PHP版本</strong></p>
<p style="text-indent: 2em;">这是是针对PHP版本的优化，新的换掉旧的，新的Zend引擎较旧的在速度上有较大的提升。</p>
<p style="text-indent: 2em;"><strong>3. 使用缓存</strong></p>
<p style="text-indent: 2em;">缓存，作者建议我们使用Memecache或者使用支持缓存的模板引擎smarty。 缓存是什么？我理解中的缓存是指以一种更快的访问介质，或更近的距离，或更便捷的方式（省略一些中间过程，直接获取结果）实现数据等的访问。 对于PHP来说，除了作者建议的以外，可以考虑使用opcode缓存，跳过词法解析，语法解析和生成中间代码的过程。</p>
<p style="text-indent: 2em;"><strong>4. 使用输出缓冲</strong></p>
<p style="text-indent: 2em;">作者的意思应该是避免缓冲太多的数据，尽早的将数据发送到客户端。</p>
<p style="text-indent: 2em;"><strong>5. 避免写那些傻傻的set和get方法</strong></p>
<p style="text-indent: 2em;">这个是针对使用set和get方法存储和获取变量的方式。作者的建议是直接使用public成员变量，直接操作。 这点在面向对象的编程思想中是有一些问题的，但就效率来说，确实有提高。为什么呢？这个得从PHP中对象的结构说起。对象存储结构：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;"><span style="color: #1299da;">typedef</span> <span style="color: #1299da;">struct</span> _zend_object <span style="color: #ffffff;">{</span>
    zend_class_entry <span style="color: #e0882f;">*</span>ce<span style="color: #e0882f;">;</span>
    HashTable <span style="color: #e0882f;">*</span>properties<span style="color: #e0882f;">;</span>
    HashTable <span style="color: #e0882f;">*</span>guards<span style="color: #e0882f;">;</span> <span style="color: #bd48b3; font-style: italic;">/* protects from __get/__set ... recursion */</span>
<span style="color: #ffffff;">}</span> zend_object<span style="color: #e0882f;">;</span></pre>
<p style="text-indent: 2em;">当操作对象的成员变量时，会直接操作HashTable *properties。而如果是使用自定义的get方法和set方法，则会以成员方法的方法调用。 而这些方法都会以一个函数存在。整个调用过程和函数调用一样。 而这些方法是用户自定义的方法，则会生成中间代码，执行这些函数就会执行这些中间代码，整个流程相对于直接操作变量有本质上的区别,性能当然也比不上了。</p>
<p style="text-indent: 2em;"><strong>6. 不要随意复制变量</strong></p>
<p style="text-indent: 2em;">这点，曾经也被人诟病过，其实作者的观点是没有错的，只是不能依据这个标题来作判断，看其示例：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;"><a style="color: #1299da; text-decoration: none;" href="http://www.php.net/echo"><span style="color: #e2392d;">echo</span></a> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/strip_tags"><span style="color: #e2392d;">strip_tags</span></a><span style="color: #ffffff;">(</span><span style="color: #6d9cbe;">$_POST</span><span style="color: #ffffff;">[</span><span style="color: #56db3a;">'description'</span><span style="color: #ffffff;">]</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>

<span style="color: #bc9458; font-style: italic;">// 对比</span>

<span style="color: #6d9cbe;">$description</span> <span style="color: #e0882f;">=</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/strip_tags"><span style="color: #e2392d;">strip_tags</span></a><span style="color: #ffffff;">(</span><span style="color: #6d9cbe;">$_POST</span><span style="color: #ffffff;">[</span><span style="color: #56db3a;">'description'</span><span style="color: #ffffff;">]</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>
<a style="color: #1299da; text-decoration: none;" href="http://www.php.net/echo"><span style="color: #e2392d;">echo</span></a> <span style="color: #6d9cbe;">$description</span><span style="color: #e0882f;">;</span></pre>
<p style="text-indent: 2em;">同样是输出处理过的$_POST['description']值。第二种方法较第一种方法多了一个变量。 这对于PHP生成的中间代码来说，这样多了一步赋值操作，也多了一个生成全局的变量$description的过程（假设代码是在全局范围内执行），从而在时间和空间上都会有一些浪费。 但是如果从另一个方面考虑：这个函数的返回值需要在后面多个地方用到，那么这里还是使用变量存放会好一些。</p>
<p style="text-indent: 2em;"><strong>7. 不要在循环中使用SQL查询</strong></p>
<p style="text-indent: 2em;">这也是一个在其它语言中也同样适用的建议。把SQL放入循环中，天知道这个循环会执行多少次，每一次执行都会有一次数据库请求。 假设循环有一万次，想象一下，连续的一万次数据库查询。。。。 这样的问题经常会出现在面向对象的编程中，由于封装等问题，查询被封装在类中。从而导致一些不可见的查询操作被放到了循环中。 对于这种情况，可以考虑将需要的多次查询的数据一次取出，然后在循环中直接调用内存中的数据。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2011/03/optimizing-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
