<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mysql on 勇气</title><link>https://courages.us/tag/mysql/</link><description>Recent content in Mysql on 勇气</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Mon, 03 Jun 2019 22:03:37 +0800</lastBuildDate><atom:link href="https://courages.us/tag/mysql/index.xml" rel="self" type="application/rss+xml"/><item><title>Jupyter Notebook</title><link>https://courages.us/jupyter-notebook/</link><pubDate>Mon, 03 Jun 2019 15:30:07 +0800</pubDate><guid>https://courages.us/jupyter-notebook/</guid><description>&lt;p&gt;对于编程初学者，如果有一个开箱即用的环境，比如web页面，就可以进行编程交互，那是极友好。有时候我们想在远程服务器上执行一些脚本，输出一些结果，比如科学计算；有时候又想在服务器上执行一些命令但又不能直接登录服务器，如果能够在web界面上操作或作为跳板机，那也是极友好的。&lt;a class="link" href="https://jupyter.org/" target="_blank" rel="noopener"&#10; &gt;Jupyter Notebook&lt;/a&gt;是基于&lt;a class="link" href="https://ipython.org/" target="_blank" rel="noopener"&#10; &gt;IPython&lt;/a&gt;的一个基于web交互执行的在线环境，支持Python，也支持其他编程语言，比如Julia和R。所创建Notebook文档可以自动保存执行过的代码、结果，方便进行回放。&lt;br&gt;&#10;Jupyter Notebok的&lt;a class="link" href="https://jupyter.org/install" target="_blank" rel="noopener"&#10; &gt;安装&lt;/a&gt;很方便，可以使用Anaconda来安装，或者手动安装。Python3下手动安装，&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip3 install jupyter&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;$PATH:/usr/local/python3/bin&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看一下&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;root@localhost local&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&lt;span style="color:#75715e"&gt;# pip3 show jupyter&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Name: jupyter&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Version: 1.0.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Summary: Jupyter metapackage. Install all the Jupyter components in one go.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Home-page: http://jupyter.org&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Author: Jupyter Development Team&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Author-email: jupyter@googlegroups.org&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;License: BSD&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Location: /usr/local/python3/lib/python3.7/site-packages&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Requires: jupyter-console, notebook, ipywidgets, nbconvert, qtconsole, ipykernel&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Required-by: &#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果直接运行jupyter notebook，那么会生成一个本地可以访问的带token的url，每次都不一样，不是很方便。设置密码，以便登录&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;root@localhost opt&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&lt;span style="color:#75715e"&gt;# jupyter notebook password&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Enter password: &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Verify password: &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;NotebookPasswordApp&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Wrote hashed password to /root/.jupyter/jupyter_notebook_config.json&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;root@localhost bin&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&lt;span style="color:#75715e"&gt;# cat /root/.jupyter/jupyter_notebook_config.json &lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;NotebookApp&amp;#34;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;password&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;sha1:e04153005102:961b12eef91987a06b497f915fc3f18c62d8f714&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;由于是在虚拟机里面，我们并不需要Jupyter自动打开浏览器，但需要监听来自任意IP的请求，指定端口9030。这里使用root用户运行Jupyter，默认是不允许的：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;root@localhost opt&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&lt;span style="color:#75715e"&gt;# jupyter notebook --no-browser --allow-root --ip 0.0.0.0 --port 9030&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;I 02:13:44.320 NotebookApp&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Serving notebooks from local directory: /opt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;I 02:13:44.320 NotebookApp&lt;span style="color:#f92672"&gt;]&lt;/span&gt; The Jupyter Notebook is running at:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;I 02:13:44.320 NotebookApp&lt;span style="color:#f92672"&gt;]&lt;/span&gt; http://&lt;span style="color:#f92672"&gt;(&lt;/span&gt;localhost.localdomain or 127.0.0.1&lt;span style="color:#f92672"&gt;)&lt;/span&gt;:9030/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;I 02:13:44.320 NotebookApp&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Use Control-C to stop this server and shut down all kernels &lt;span style="color:#f92672"&gt;(&lt;/span&gt;twice to skip confirmation&lt;span style="color:#f92672"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;I 02:13:59.664 NotebookApp&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;302&lt;/span&gt; GET / &lt;span style="color:#f92672"&gt;(&lt;/span&gt;192.168.33.1&lt;span style="color:#f92672"&gt;)&lt;/span&gt; 1.22ms&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;I 02:14:23.597 NotebookApp&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Kernel started: 7ad63717-7a65-4dec-9d5a-9af654c28f75&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;I 02:14:25.204 NotebookApp&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Adapting to protocol v5.1 &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; kernel 7ad63717-7a65-4dec-9d5a-9af654c28f75&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;I 02:14:37.350 NotebookApp&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Starting buffering &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; 7ad63717-7a65-4dec-9d5a-9af654c28f75:ea68853b742c40f8bcf8745529ea95de&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;I 02:14:43.735 NotebookApp&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Kernel started: 5b569c8d-6936-4bd2-9674-0317c46948f6&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;I 02:14:44.124 NotebookApp&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Adapting to protocol v5.0 &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; kernel 5b569c8d-6936-4bd2-9674-0317c46948f6&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;2019-06-03 02:14:43&lt;span style="color:#f92672"&gt;]&lt;/span&gt; kernel.DEBUG: Connection settings &lt;span style="color:#f92672"&gt;{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;processId&amp;#34;&lt;/span&gt;:6751,&lt;span style="color:#e6db74"&gt;&amp;#34;connSettings&amp;#34;&lt;/span&gt;:&lt;span style="color:#f92672"&gt;{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;shell_port&amp;#34;&lt;/span&gt;:39990,&lt;span style="color:#e6db74"&gt;&amp;#34;iopub_port&amp;#34;&lt;/span&gt;:48184,&lt;span style="color:#e6db74"&gt;&amp;#34;stdin_port&amp;#34;&lt;/span&gt;:40113,&lt;span style="color:#e6db74"&gt;&amp;#34;control_port&amp;#34;&lt;/span&gt;:43426,&lt;span style="color:#e6db74"&gt;&amp;#34;hb_port&amp;#34;&lt;/span&gt;:49075,&lt;span style="color:#e6db74"&gt;&amp;#34;ip&amp;#34;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;key&amp;#34;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#34;d5f89bba-890ecf15e6b20718411170ad&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;transport&amp;#34;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#34;tcp&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;signature_scheme&amp;#34;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#34;hmac-sha256&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;kernel_name&amp;#34;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#34;jupyter-php&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;connUris&amp;#34;&lt;/span&gt;:&lt;span style="color:#f92672"&gt;{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;stdin&amp;#34;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#34;tcp://127.0.0.1:40113&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;control&amp;#34;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#34;tcp://127.0.0.1:43426&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;hb&amp;#34;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#34;tcp://127.0.0.1:49075&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;shell&amp;#34;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#34;tcp://127.0.0.1:39990&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;iopub&amp;#34;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#34;tcp://127.0.0.1:48184&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;}}&lt;/span&gt; &lt;span style="color:#f92672"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;2019-06-03 02:14:44&lt;span style="color:#f92672"&gt;]&lt;/span&gt; KernelCore.DEBUG: Initialized sockets &lt;span style="color:#f92672"&gt;{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;processId&amp;#34;&lt;/span&gt;:6751&lt;span style="color:#f92672"&gt;}&lt;/span&gt; &lt;span style="color:#f92672"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后打开浏览器，访问http://192.168.33.70:9030，输入账号密码，就可以在web里面运行Python了&lt;br&gt;&#10;&lt;a class="link" href="https://courages.us/wp-content/uploads/2019/06/jupyter_hello.png" target="_blank" rel="noopener"&#10; &gt;&lt;img class="gallery-image" data-flex-basis="791px" data-flex-grow="329" height="91" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://courages.us/wp-content/uploads/2019/06/jupyter_hello-300x91.png" width="300"&gt;&lt;/a&gt;&lt;br&gt;&#10;Jupyter默认带了SQL扩展，使用&lt;a class="link" href="https://pypi.org/project/ipython-sql/" target="_blank" rel="noopener"&#10; &gt;ipython-sql&lt;/a&gt;来执行，只需要安装对应的驱动，这里使用&lt;a class="link" href="https://docs.sqlalchemy.org/en/13/dialects/mysql.html" target="_blank" rel="noopener"&#10; &gt;PyMySQL&lt;/a&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python3 -m pip install PyMySQL&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后在Web里面执行就可以了&lt;br&gt;&#10;&lt;a class="link" href="https://courages.us/wp-content/uploads/2019/06/jupyter_sql_dataframe.png" target="_blank" rel="noopener"&#10; &gt;&lt;img class="gallery-image" data-flex-basis="367px" data-flex-grow="153" height="196" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://courages.us/wp-content/uploads/2019/06/jupyter_sql_dataframe-300x196.png" width="300"&gt;&lt;/a&gt;&lt;br&gt;&#10;Jupyter还有其他&lt;a class="link" href="https://github.com/ipython/ipython/wiki/Extensions-Index" target="_blank" rel="noopener"&#10; &gt;扩展&lt;/a&gt;，参考&lt;a class="link" href="https://github.com/ipython-contrib/jupyter_contrib_nbextensions" target="_blank" rel="noopener"&#10; &gt;这里&lt;/a&gt;。&lt;br&gt;&#10;除了可以执行Python和SQL，Jupyter Notebook也可以支持其他语言，在&lt;a class="link" href="https://github.com/jupyter/jupyter/wiki/Jupyter-kernels" target="_blank" rel="noopener"&#10; &gt;这里&lt;/a&gt;列出了。通常&lt;a class="link" href="https://jupyter.readthedocs.io/en/latest/architecture/how_jupyter_ipython_work.html" target="_blank" rel="noopener"&#10; &gt;执行方式&lt;/a&gt;是通过Bash执行，或者通过ZeroMQ来通信，参考&lt;a class="link" href="https://jupyter-client.readthedocs.io/en/latest/messaging.html" target="_blank" rel="noopener"&#10; &gt;这里&lt;/a&gt;实现。一个Jupyter的kernal将需要监听以下几个socket：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Shell：执行命令&lt;/li&gt;&#10;&lt;li&gt;IOPub：推送执行结果&lt;/li&gt;&#10;&lt;li&gt;Stdin：接收输入&lt;/li&gt;&#10;&lt;li&gt;Control：接收控制命令，比如关闭、终端&lt;/li&gt;&#10;&lt;li&gt;Heartbeat：心跳检测&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这个思路也可以用来做IOT设备的远程监控，交互执行。&lt;br&gt;&#10;这里安装一下&lt;a class="link" href="https://github.com/Litipk/Jupyter-PHP" target="_blank" rel="noopener"&#10; &gt;PHP 7&lt;/a&gt;这个kernel，作者甚至还提供了&lt;a class="link" href="https://litipk.github.io/Jupyter-PHP-Installer/" target="_blank" rel="noopener"&#10; &gt;installer&lt;/a&gt;，但是首先要安装ZeroMQ以便与Jupyter服务通信&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum install php-pecl-zmq&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget https://litipk.github.io/Jupyter-PHP-Installer/dist/jupyter-php-installer.phar&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./jupyter-php-installer.phar install&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看安装文件&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;root@localhost opt&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&lt;span style="color:#75715e"&gt;# ls -la /usr/local/share/jupyter/kernels/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;total &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;drwxr-xr-x. &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;34&lt;/span&gt; May &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt; 06:10 .&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;drwxr-xr-x. &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt; May &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 07:30 ..&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;drwxr-xr-x. &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;24&lt;/span&gt; May &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 07:30 jupyter-php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;drwxr-xr-x. &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;40&lt;/span&gt; May &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt; 06:10 lgo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;root@localhost opt&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&lt;span style="color:#75715e"&gt;# cat /usr/local/share/jupyter/kernels/jupyter-php/kernel.json &lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;argv&amp;#34;&lt;/span&gt;:&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;php&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;\/opt\/jupyter-php\/pkgs\/vendor\/litipk\/jupyter-php\/src\/kernel.php&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;{connection_file}&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;display_name&amp;#34;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#34;PHP&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;language&amp;#34;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#34;php&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;env&amp;#34;&lt;/span&gt;:&lt;span style="color:#f92672"&gt;{}}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个扩展使用了&lt;a class="link" href="https://packagist.org/packages/react/zmq" target="_blank" rel="noopener"&#10; &gt;react/zmq&lt;/a&gt;来监听Jupyter请求，使用&lt;a class="link" href="https://psysh.org/" target="_blank" rel="noopener"&#10; &gt;psysh&lt;/a&gt;来交互执行PHP代码。&lt;br&gt;&#10;&lt;a class="link" href="https://courages.us/wp-content/uploads/2019/06/jupyter_php.png" target="_blank" rel="noopener"&#10; &gt;&lt;img class="gallery-image" data-flex-basis="734px" data-flex-grow="306" height="98" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://courages.us/wp-content/uploads/2019/06/jupyter_php-300x98.png" width="300"&gt;&lt;/a&gt;&lt;br&gt;&#10;如果想要更改Jupyter的web模板，可以在以下目录找到&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;root@localhost vagrant&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&lt;span style="color:#75715e"&gt;# ls -la /usr/local/python3/lib/python3.7/site-packages/notebook/templates&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;total &lt;span style="color:#ae81ff"&gt;92&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;drwxr-xr-x. &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;4096&lt;/span&gt; May &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 06:33 .&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;drwxr-xr-x. &lt;span style="color:#ae81ff"&gt;19&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;4096&lt;/span&gt; May &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 06:33 ..&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r--. &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;147&lt;/span&gt; May &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 06:33 404.html&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r--. &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;499&lt;/span&gt; May &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 06:33 browser-open.html&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r--. &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;4258&lt;/span&gt; May &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 06:33 edit.html&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r--. &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;856&lt;/span&gt; May &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 06:33 error.html&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r--. &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;4256&lt;/span&gt; May &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 06:33 login.html&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r--. &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;1179&lt;/span&gt; May &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 06:33 logout.html&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r--. &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;23162&lt;/span&gt; May &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 06:33 notebook.html&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r--. &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;6559&lt;/span&gt; May &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 06:33 page.html&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r--. &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;1089&lt;/span&gt; May &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 06:33 terminal.html&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r--. &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;12130&lt;/span&gt; May &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 06:33 tree.html&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r--. &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;544&lt;/span&gt; May &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 06:33 view.html&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jupyter Notebook Web前端采用WebSocket与服务器交互，服务器接收消息并转发给对应的kernel执行或控制，并将结果推送给前端。Jupyter Notebook也可以直接打开Terminal，在远程服务器上执行命令。注意这里的用户就是刚才运行jupyter的用户&lt;br&gt;&#10;&lt;a class="link" href="https://courages.us/wp-content/uploads/2019/06/jupyter_terminal.png" target="_blank" rel="noopener"&#10; &gt;&lt;img class="gallery-image" data-flex-basis="402px" data-flex-grow="167" height="179" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://courages.us/wp-content/uploads/2019/06/jupyter_terminal-300x179.png" width="300"&gt;&lt;/a&gt;&lt;br&gt;&#10;许多web terminal也都是采用WebSocket来做交互，比如&lt;a class="link" href="https://github.com/xtermjs/xterm.js" target="_blank" rel="noopener"&#10; &gt;xterm.js&lt;/a&gt;，&lt;a class="link" href="https://github.com/krishnasrinivas/wetty" target="_blank" rel="noopener"&#10; &gt;webtty&lt;/a&gt;。&lt;br&gt;&#10;Juypter Notebook适合单用户（单机）使用，如果提供多用户使用（比如教学），可以使用&lt;a class="link" href="https://jupyter.org/hub" target="_blank" rel="noopener"&#10; &gt;Jupyter Hub&lt;/a&gt;，可以使用&lt;a class="link" href="https://github.com/jupyter/docker-stacks" target="_blank" rel="noopener"&#10; &gt;docker&lt;/a&gt;快捷部署。&lt;/p&gt;&#10;&lt;p&gt;参考链接：&lt;br&gt;&#10;&lt;a class="link" href="https://towardsdatascience.com/jupyter-notebook-extensions-517fa69d2231" target="_blank" rel="noopener"&#10; &gt;Jupyter Notebook Extensions&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="https://jupyter.readthedocs.io/en/latest/projects/content-projects.html" target="_blank" rel="noopener"&#10; &gt;Jupyter – How do I decide which packages I need?&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://vergil.cn/archives/psysh" target="_blank" rel="noopener"&#10; &gt;PsySH——PHP交互式控制台&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="https://zh.wikipedia.org/wiki/Jupyter%E9%A1%B9%E7%9B%AE" target="_blank" rel="noopener"&#10; &gt;Jupyter项目&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://www.ruanyifeng.com/blog/2017/05/websocket.html" target="_blank" rel="noopener"&#10; &gt;WebSocket 教程&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>使用Docker Compose管理Docker容器</title><link>https://courages.us/%E4%BD%BF%E7%94%A8docker-compose%E7%AE%A1%E7%90%86docker%E5%AE%B9%E5%99%A8/</link><pubDate>Fri, 30 Sep 2016 00:10:36 +0800</pubDate><guid>https://courages.us/%E4%BD%BF%E7%94%A8docker-compose%E7%AE%A1%E7%90%86docker%E5%AE%B9%E5%99%A8/</guid><description>&lt;p&gt;&lt;a class="link" href="https://courages.us/%e6%9e%84%e5%bb%ba%e5%9f%ba%e4%ba%8edocker%e7%9a%84nginx-php-fpm-phalcon%e9%95%9c%e5%83%8f/" target="_blank" rel="noopener"&#10; &gt;上一篇&lt;/a&gt;创建了一个PHP的运行环境，现在需要一个MySQL服务，直接运行：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root@thinkpad:~# docker run --name rocket-mysql -v /home/rocketfish/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD&lt;span style="color:#f92672"&gt;=&lt;/span&gt;root -d mysql:5.7&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;就自动下载并得到一个mysql版本为5.7的服务镜像。&lt;br&gt;&#10;这时候，要运行一个Web服务我们需要运行两次的docker run才可以，如果还有更多的Web容器或其他的服务容器呢？&lt;br&gt;&#10;Docker官方提倡一个容器仅提供一个服务，多个服务/容器可以使用docker-compose来管理。&lt;br&gt;&#10;docker-compose本身是一个Python写的工具，可以直接通过pip安装：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root@thinkpad:~# sudo pip install --upgrade pip&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果你本地并没有Python环境，也可以采用docker-compose的docker镜像来运行：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root@thinkpad:/home/compose-web# curl -L https://github.com/docker/compose/releases/download/1.8.0/run.sh &amp;gt; /usr/local/bin/docker-compose&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root@thinkpad:/home/compose-web# docker-compose --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#开始下载镜像，建议用第一种&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看帮助&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root@thinkpad:~# docker-compose -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Define and run multi-container applications with Docker.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Usage:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; docker-compose &lt;span style="color:#f92672"&gt;[&lt;/span&gt;-f &amp;lt;arg&amp;gt;...&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;options&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;COMMAND&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;ARGS...&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; docker-compose -h|--help&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Options:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -f, --file FILE Specify an alternate compose file &lt;span style="color:#f92672"&gt;(&lt;/span&gt;default: docker-compose.yml&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -p, --project-name NAME Specify an alternate project name &lt;span style="color:#f92672"&gt;(&lt;/span&gt;default: directory name&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --verbose Show more output&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -v, --version Print version and exit&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -H, --host HOST Daemon socket to connect to&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --tls Use TLS; implied by --tlsverify&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --tlscacert CA_PATH Trust certs signed only by this CA&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --tlscert CLIENT_CERT_PATH Path to TLS certificate file&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --tlskey TLS_KEY_PATH Path to TLS key file&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --tlsverify Use TLS and verify the remote&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --skip-hostname-check Don&lt;span style="color:#e6db74"&gt;&amp;#39;t check the daemon&amp;#39;&lt;/span&gt;s hostname against the name specified&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; in the client certificate &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; example &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; your docker host&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; is an IP address&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Commands:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; build Build or rebuild services&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bundle Generate a Docker bundle from the Compose file&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config Validate and view the compose file&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; create Create services&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; down Stop and remove containers, networks, images, and volumes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; events Receive real time events from containers&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exec Execute a command in a running container&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; help Get help on a command&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kill Kill containers&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logs View output from containers&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pause Pause services&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; port Print the public port &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; a port binding&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ps List containers&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pull Pulls service images&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; push Push service images&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; restart Restart services&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rm Remove stopped containers&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; run Run a one-off command&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; scale Set number of containers &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; a service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; start Start services&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stop Stop services&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; unpause Unpause services&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; up Create and start containers&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; version Show the Docker-Compose version information&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这些命令包括了创建/启动/停止/暂停/继续运行容器。&lt;br&gt;&#10;首先要创建docker-compose.yml，这是一个&lt;a class="link" href="http://yaml.org/" target="_blank" rel="noopener"&#10; &gt;YAML&lt;/a&gt;格式的文档&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir web&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir db&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vim docker-compose.yml&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;内容如下：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;version: &amp;#39;2&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;services:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; db:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; image: mysql:5.7&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ports:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &amp;#34;3306:3306&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; restart: always&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; environment:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MYSQL_ROOT_PASSWORD: root&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MYSQL_DATABASE: web&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MYSQL_USER: root&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MYSQL_PASSWORD: rootweb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; volumes:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - ./db/data:/var/lib/mysql&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; web:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; depends_on:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - db&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; image: nginx-php-fpm:phalcon&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ports:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &amp;#34;80:80&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; restart: always&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; environment:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; WEB_DB_HOST: db:3306&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; WEB_DB_PASSWORD: root&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; volumes:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - ./web/html:/var/www/html/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; links:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - db&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里的environment定义了环境变量，比如host的MAC，就可以在docker容器的系统变量里面得到，各个编程语言都有获取系统环境变量的方法。这些变量也可以组织起来放在文件里面加载进去，参考&lt;a class="link" href="https://docs.docker.com/compose/environment-variables/" target="_blank" rel="noopener"&#10; &gt;这里&lt;/a&gt;。&lt;br&gt;&#10;这里的volumes定义了要映射进容器的文件或文件夹或者数据容器，可以参考&lt;a class="link" href="https://docs.docker.com/engine/tutorials/dockervolumes/" target="_blank" rel="noopener"&#10; &gt;这里&lt;/a&gt;。注意，多个容器共享同一个目录，会出现写冲突，比如MySQL，多个实例，数据目录需要分开。所以设计好你的程序，哪一部分是需要只读的（可以共享)，哪一部分是需要写的；写的部分是否可以放到各自临时目录，或者其他公共服务里面。&lt;br&gt;&#10;运行并查看&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root@thinkpad:/home/compose-web# docker-compose up -d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Creating network &lt;span style="color:#e6db74"&gt;&amp;#34;composeweb_default&amp;#34;&lt;/span&gt; with the default driver&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Creating composeweb_db_1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Creating composeweb_web_1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root@thinkpad:/home/compose-web# docker-compose ps&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Name Command State Ports &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;------------------------------------------------------------------------------------&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;composeweb_db_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306-&amp;gt;3306/tcp &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;composeweb_web_1 /start.sh Up 443/tcp, 0.0.0.0:80-&amp;gt;80/tcp &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#也可以使用原来的命令&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root@thinkpad:/home/compose-web# docker ps&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;efbdaf257748 nginx-php-fpm:phalcon &lt;span style="color:#e6db74"&gt;&amp;#34;/start.sh&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;13&lt;/span&gt; seconds ago Up &lt;span style="color:#ae81ff"&gt;11&lt;/span&gt; seconds 0.0.0.0:80-&amp;gt;80/tcp, 443/tcp composeweb_web_1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;a6935d20911e mysql:5.7 &lt;span style="color:#e6db74"&gt;&amp;#34;docker-entrypoint.sh&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;14&lt;/span&gt; seconds ago Up &lt;span style="color:#ae81ff"&gt;13&lt;/span&gt; seconds 0.0.0.0:3306-&amp;gt;3306/tcp composeweb_db_1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;docker-compose up -d ，将会在后台启动并运行所有的容器。&lt;br&gt;&#10;docker-compose仅仅提供了对多个docker服务的管理，仍然可以在这些容器上运行原来的docker命令。检查下web容器的IP：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root@thinkpad:/home/compose-web# docker inspect composeweb_web_1 | grep IPAddress&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;SecondaryIPAddresses&amp;#34;&lt;/span&gt;: null,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;IPAddress&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;IPAddress&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;172.18.0.3&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后访问：http://172.18.0.3/ 就可以看到web页面了。&lt;br&gt;&#10;如果想要停止服务，可以用docker-compose stop：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root@thinkpad:/home/compose-web# docker-compose stop db&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Stopping composeweb_db_1 ... &lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root@thinkpad:/home/compose-web# docker-compose stop web&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Stopping composeweb_web_1 ... &lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再次启动，得到相同名称的服务:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root@thinkpad:/home/compose-web# docker-compose up -d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Starting composeweb_db_1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Starting composeweb_web_1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;各个容器的名称也可以在配置文件里面通过参数container_name来指定。&lt;br&gt;&#10;docker-compose的配置还有很多其他的&lt;a class="link" href="https://docs.docker.com/compose/compose-file/" target="_blank" rel="noopener"&#10; &gt;参数&lt;/a&gt;，可以参考&lt;a class="link" href="https://docs.docker.com/compose/compose-file/#ipv4-address-ipv6-address" target="_blank" rel="noopener"&#10; &gt;这里&lt;/a&gt;。比如刚才我们通过docker inspect来查找容器IP，也可以配置成静态IP：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;version: &amp;#39;2&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;services:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; app:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; image: nginx-php-fpm:phalcon&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; networks:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; app_net:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ipv4_address: 172.18.0.10&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ipv6_address: 2001:3984:3989::10&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;networks:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; app_net:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; driver: bridge&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; driver_opts:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; com.docker.network.enable_ipv6: &amp;#34;true&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ipam:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; driver: default&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - subnet: 172.18.0.0/24&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; gateway: 172.18.0.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - subnet: 2001:3984:3989::/64&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; gateway: 2001:3984:3989::1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;也可以&lt;a class="link" href="https://docs.docker.com/compose/networking/" target="_blank" rel="noopener"&#10; &gt;自定义网络&lt;/a&gt;。&lt;br&gt;&#10;刚才我们的配置文件里面直接指定了镜像，也可以指定Dockerfile镜像构建，假如Dockerfile在web目录下面:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;build:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; context: ./web&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者直接指明Dockerfile：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;build:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; context: .&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dockerfile: Dockerfile-alternate&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;实际上，docker-compose的配置已经覆盖了&lt;a class="link" href="https://docs.docker.com/engine/reference/builder/" target="_blank" rel="noopener"&#10; &gt;Dockerfile&lt;/a&gt;的配置项，也可以直接用于构建多个docker服务，比如指定运行的命令&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;command: [/bin/bash]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里的入口程序，如果不能持续运行的话，运行完成后，docker就会退出。所以如果你需要可以后台运行的docker容器，那么入口程序，就必须保持一个程序在前台运行，不退出，比如运行crontab的镜像，入口程序可以是：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cron &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;cron这个程序是在后台运行的，如果不配合前台程序bash，容器执行玩cron就会退出了。其他运行crontab的容器，大都是强制一个程序在前台不退出，比如&lt;a class="link" href="https://www.ekito.fr/people/run-a-cron-job-with-docker/" target="_blank" rel="noopener"&#10; &gt;这个&lt;/a&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cron &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; tail -f /var/log/cron.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里需要注意一下，通过docker设置的environment values在容器内的cli下面执行时取不到的，比如printenv，使用cron后台运行时取不到外部设置的变量，但是手动执行时又可以。这些外部环境变量只能在ENTRYPOINT或者CMD所执行的shell里面去设置，比如在CMD执行start.sh:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;printenv | grep -E &lt;span style="color:#e6db74"&gt;&amp;#34;^HOST&amp;#34;&lt;/span&gt; &amp;gt; /root/env.conf &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; cron &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Docker compose还可以跟&lt;a class="link" href="https://docs.docker.com/compose/swarm/" target="_blank" rel="noopener"&#10; &gt;Docker Swarm&lt;/a&gt;结合。&lt;/p&gt;&#10;&lt;p&gt;参考链接：&lt;br&gt;&#10;&lt;a class="link" href="https://docs.docker.com/compose/install/" target="_blank" rel="noopener"&#10; &gt;Install Docker Compose&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="https://docs.docker.com/compose/wordpress/" target="_blank" rel="noopener"&#10; &gt;Quickstart: Docker Compose and WordPress&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="https://github.com/yeasy/docker_practice/blob/master/compose/yaml_file.md" target="_blank" rel="noopener"&#10; &gt;YAML 模板文件&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="https://www.linux.com/learn/introduction-docker-compose-tool-multi-container-applications" target="_blank" rel="noopener"&#10; &gt;Introduction to Docker Compose Tool for Multi-Container Applications&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="https://github.com/yeasy/docker_practice/blob/master/dockerfile/basic_structure.md" target="_blank" rel="noopener"&#10; &gt;Dockerfile基本结构&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://staxmanade.com/2016/05/how-to-get-environment-variables-passed-through-docker-compose-to-the-containers/" target="_blank" rel="noopener"&#10; &gt;How to Get Environment Variables Passed Through docker-compose to the Containers&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="https://ypereirareis.github.io/blog/2016/02/29/docker-crontab-environment-variables/" target="_blank" rel="noopener"&#10; &gt;Access environment variables from crontab into a docker container&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://stackoverflow.com/questions/27771781/how-can-i-access-docker-set-environment-variables-from-a-cron-job" target="_blank" rel="noopener"&#10; &gt;How can I access Docker set Environment Variables From a Cron Job&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="https://segmentfault.com/q/1010000000417103" target="_blank" rel="noopener"&#10; &gt;Dockerfile里指定执行命令用ENTRYPOING和用CMD有何不同？&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://stackoverflow.com/questions/21553353/what-is-the-difference-between-cmd-and-entrypoint-in-a-dockerfile" target="_blank" rel="noopener"&#10; &gt;What is the difference between CMD and ENTRYPOINT in a Dockerfile?&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="https://til.codes/docker-run-vs-cmd-vs-entrypoint/" target="_blank" rel="noopener"&#10; &gt;Docker difference between run, cmd, entrypoint commands&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>MySql 慢日志分析</title><link>https://courages.us/mysql-%E6%85%A2%E6%97%A5%E5%BF%97%E5%88%86%E6%9E%90/</link><pubDate>Mon, 05 Oct 2015 14:27:50 +0800</pubDate><guid>https://courages.us/mysql-%E6%85%A2%E6%97%A5%E5%BF%97%E5%88%86%E6%9E%90/</guid><description>&lt;p&gt;最近老是碰上MySql报错：1203:User already has more than ‘max_user_connections’ active，之前都没出现过，感觉应该是慢查询导致的。向运维拷贝慢日志分析，慢日志开、启配置参考&lt;a class="link" href="http://my.oschina.net/moooofly/blog/160201" target="_blank" rel="noopener"&#10; &gt;这里&lt;/a&gt;。&lt;br&gt;&#10;拷贝出来的日志很大，需要按故障时间点做一下切割，以便缩小排查范围。按照&lt;a class="link" href="https://github.com/wubx/mysql-binlog-statistic/blob/master/bin/cutlogbytime" target="_blank" rel="noopener"&#10; &gt;这里&lt;/a&gt;提供的cutlogbytime.pl脚本运行却报错&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;vagrant@centos64 mysql-log-filter-1.9&lt;span style="color:#f92672"&gt;]&lt;/span&gt;$ ./cutlogbytime.pl slow.log &lt;span style="color:#ae81ff"&gt;1443103200&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1443117600&lt;/span&gt; &amp;gt; yestoday.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;: command not foundline 1:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;: command not foundline 4:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./cutlogbytime.pl: line 5: use: command not found&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;: command not foundline 5:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./cutlogbytime.pl: line 6: use: command not found&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;: command not foundline 6:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;: command not foundline 7:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;/cutlogbytime.pl: line 8: syntax error near unexpected token `{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;/cutlogbytime.pl: line 8: &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;@ARGV&amp;lt;2&lt;span style="color:#f92672"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;去掉顶行的空格后再运行，还是报错&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;vagrant@centos64 mysql-log-filter-1.9&lt;span style="color:#f92672"&gt;]&lt;/span&gt;$ ./cutlogbytime.pl slow.log &lt;span style="color:#ae81ff"&gt;1443103200&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1443117600&lt;/span&gt; &amp;gt; today.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-bash: ./cutlogbytime.pl: /usr/bin/perl^M: bad interpreter: No such file or directory&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最后参考&lt;a class="link" href="http://stackoverflow.com/questions/2517106/why-do-i-get-use-command-not-found-when-i-run-my-perl-script" target="_blank" rel="noopener"&#10; &gt;stackoverflow上面的答案&lt;/a&gt;更改运行方式为Perl（而不是shell），就可以了。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;vagrant@centos64 mysql-log-filter-1.9&lt;span style="color:#f92672"&gt;]&lt;/span&gt;$ perl cutlogbytime.pl slow.log &lt;span style="color:#ae81ff"&gt;1443103200&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1443117600&lt;/span&gt; &amp;gt; today.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;利用mysqlslowdump（perl脚本）来分析日志，-s参数表示排序方式：r表示影响行数（Rows），t表示耗时（Time），c表示查询次数（Count）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;vagrant@entos64 mysql-log-filter-1.9&lt;span style="color:#f92672"&gt;]&lt;/span&gt;$ perl mysqldumpslow.pl -s r -t &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt; today4.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Reading mysql slow query log from today4.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Count: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; Time&lt;span style="color:#f92672"&gt;=&lt;/span&gt;190.48s &lt;span style="color:#f92672"&gt;(&lt;/span&gt;190s&lt;span style="color:#f92672"&gt;)&lt;/span&gt; Lock&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0.00s &lt;span style="color:#f92672"&gt;(&lt;/span&gt;0s&lt;span style="color:#f92672"&gt;)&lt;/span&gt; Rows&lt;span style="color:#f92672"&gt;=&lt;/span&gt;21829854.0 &lt;span style="color:#f92672"&gt;(&lt;/span&gt;21829854&lt;span style="color:#f92672"&gt;)&lt;/span&gt;, xx&lt;span style="color:#f92672"&gt;[&lt;/span&gt;xxxx&lt;span style="color:#f92672"&gt;]&lt;/span&gt;@&lt;span style="color:#f92672"&gt;[&lt;/span&gt;192.168.10.139&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SELECT /*!N SQL_NO_CACHE */ * FROM &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;errormessage&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Count: &lt;span style="color:#ae81ff"&gt;32791&lt;/span&gt; Time&lt;span style="color:#f92672"&gt;=&lt;/span&gt;40.95s &lt;span style="color:#f92672"&gt;(&lt;/span&gt;1342865s&lt;span style="color:#f92672"&gt;)&lt;/span&gt; Lock&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0.05s &lt;span style="color:#f92672"&gt;(&lt;/span&gt;1512s&lt;span style="color:#f92672"&gt;)&lt;/span&gt; Rows&lt;span style="color:#f92672"&gt;=&lt;/span&gt;1.0 &lt;span style="color:#f92672"&gt;(&lt;/span&gt;32791&lt;span style="color:#f92672"&gt;)&lt;/span&gt;, xx&lt;span style="color:#f92672"&gt;[&lt;/span&gt;xxxx&lt;span style="color:#f92672"&gt;]&lt;/span&gt;@10hosts&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;select&lt;/span&gt; * from connectinfo where ID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;N and AppType&lt;span style="color:#f92672"&gt;=&lt;/span&gt;N ORDER BY CreateDatetime DESC LIMIT N&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Count: &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; Time&lt;span style="color:#f92672"&gt;=&lt;/span&gt;3.71s &lt;span style="color:#f92672"&gt;(&lt;/span&gt;11s&lt;span style="color:#f92672"&gt;)&lt;/span&gt; Lock&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0.02s &lt;span style="color:#f92672"&gt;(&lt;/span&gt;0s&lt;span style="color:#f92672"&gt;)&lt;/span&gt; Rows&lt;span style="color:#f92672"&gt;=&lt;/span&gt;300.0 &lt;span style="color:#f92672"&gt;(&lt;/span&gt;900&lt;span style="color:#f92672"&gt;)&lt;/span&gt;, xx&lt;span style="color:#f92672"&gt;[&lt;/span&gt;xxxx&lt;span style="color:#f92672"&gt;]&lt;/span&gt;@2hosts&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;select&lt;/span&gt; SeverName from errormessage where ID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;S&amp;#39;&lt;/span&gt; and ServerType&lt;span style="color:#f92672"&gt;=&lt;/span&gt;N and level&lt;span style="color:#f92672"&gt;=&lt;/span&gt;N and MsgType &amp;lt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt; N&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第一个语句返回行数21829854，查看具体慢日志，之后需要插入这张表的进程均处于等待状态。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Time: 150924 1:03:12&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# User@Host: xx[xxxx] @ [192.168.10.139] Id: 1493761&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Query_time: 190.479062 Lock_time: 0.000000 Rows_sent: 21829854 Rows_examined: 21829854&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SET timestamp=1443027792;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SELECT /*!40001 SQL_NO_CACHE */ * FROM `errormessage`;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Time: 150924 1:03:14&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# User@Host: xx[xxxx] @ [192.168.10.168] Id: 1498010&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Query_time: 59.669817 Lock_time: 57.159403 Rows_sent: 0 Rows_examined: 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SET timestamp=1443027794;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;insert into errormessage (`ID`,`ServerType`,`MsgType`,`Level`,`dev`,`content`,`EventTime`,`SeverName`) values ( &amp;#39;1217&amp;#39;, &amp;#39;3&amp;#39;, &amp;#39;4&amp;#39;, &amp;#39;4&amp;#39;, &amp;#39;827&amp;#39;, &amp;#39;erc:start erc error,songid=46243,keymd5=ee1275b26762e85a7f00e9890bdc092e,ercmd5=abbc3ea9102dbd003b7aa0547dcbf6fa&amp;#39;, &amp;#39;2015-09-23 21:49:27&amp;#39;, &amp;#39;192.168.15.117&amp;#39;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# User@Host: xx[xxxx] @ [192.168.10.205] Id: 1494756&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Query_time: 157.211158 Lock_time: 154.673647 Rows_sent: 0 Rows_examined: 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SET timestamp=1443027794;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;insert into errormessage (`ID`,`ServerType`,`MsgType`,`Level`,`dev`,`content`,`EventTime`,`SeverName`) values ( &amp;#39;865&amp;#39;, &amp;#39;3&amp;#39;, &amp;#39;1&amp;#39;, &amp;#39;2&amp;#39;, &amp;#39;106&amp;#39;, &amp;#39;检测正常！&amp;#39;, &amp;#39;2015-09-24 01:01:18&amp;#39;, &amp;#39;192.168.0.33&amp;#39;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# User@Host: xx[xxxx] @ [192.168.10.213] Id: 1496479&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Query_time: 100.733230 Lock_time: 98.210902 Rows_sent: 0 Rows_examined: 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SET timestamp=1443027794;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;insert into errormessage (`ID`,`ServerType`,`MsgType`,`Level`,`dev`,`content`,`EventTime`,`SeverName`) values ( &amp;#39;2472&amp;#39;, &amp;#39;3&amp;#39;, &amp;#39;2&amp;#39;, &amp;#39;4&amp;#39;, &amp;#39;809&amp;#39;, &amp;#39;videoseripnoconfig&amp;#39;, &amp;#39;2015-09-24 01:02:26&amp;#39;, &amp;#39;192.168.0.18&amp;#39;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;分析这几天的日志，发现故障时间点附近都是这个语句引起后面的SQL堵塞。原来是每天早上1点开始备份并同步全表数据，锁住了这个表导致后面的所有这个表的insert操作处于等待状态。mysqldump应该使用&lt;a class="link" href="http://dba.stackexchange.com/questions/71961/mysqldump-single-transaction-yet-update-queries-are-waiting-for-the-backup" target="_blank" rel="noopener"&#10; &gt;–single-transaction来避免锁表&lt;/a&gt;，类似下面&lt;a class="link" href="http://tencentdba.com/blog/mysqldump-backup-principle/" target="_blank" rel="noopener"&#10; &gt;这个&lt;/a&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mysqldump –uuser -p --skip-opt -q -R --single-transaction --default-character-set&lt;span style="color:#f92672"&gt;=&lt;/span&gt;utf8 --master-data&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; --create-option --no-autocommit –S &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;sock&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; -B &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;DBName&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &amp;gt; backup.sql&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是这样仍然是全表扫描进行备份，如果能够增量备份的话，影响要小很多，或者数据做冷热/新旧之分，定期将新（每天）/热数据转入旧（历史）/冷数据中。后面运维的解决方案是：升级数据库机器从虚拟机变为实体机，配置从机，并从从机进行备份同步。&lt;/p&gt;&#10;&lt;p&gt;上面mysqlslowdump使用影响行数来排序，事实上用另外两个类型（时间，次数）分析结果是connectinfo比较频繁，一直以来都认为是这个表的操作引起的。这里还尝试了其他工具来分析，使用&lt;a class="link" href="https://github.com/daniel-nichter/hackmysql.com/tree/master/mysqlsla" target="_blank" rel="noopener"&#10; &gt;mysqlsla.pl&lt;/a&gt;进行分析，相关参数选项参考&lt;a class="link" href="https://code.google.com/p/memcache-top/issues/detail?id=12" target="_blank" rel="noopener"&#10; &gt;这里&lt;/a&gt;。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;vagrant@centos64 mysql-log-filter-1.9&lt;span style="color:#f92672"&gt;]&lt;/span&gt;$ perl mysqlsla.pl today.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Auto-detected logs as slow logs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Report &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; slow logs: today4.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;60.57k queries total, &lt;span style="color:#ae81ff"&gt;17&lt;/span&gt; unique&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Sorted by &lt;span style="color:#e6db74"&gt;&amp;#39;t_sum&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Grand Totals: Time 5.38M s, Lock 3.22M s, Rows sent 21.86M, Rows Examined 184.46M&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;______________________________________________________________________ &lt;span style="color:#ae81ff"&gt;001&lt;/span&gt; ___&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Count : 25.59k &lt;span style="color:#f92672"&gt;(&lt;/span&gt;42.24%&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Time : 3905525.574451 s total, 152.643069 s avg, 113.07488 s to 2720.338946 s max &lt;span style="color:#f92672"&gt;(&lt;/span&gt;72.64%&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 95% of Time : 3260112.482495 s total, 134.12789 s avg, 113.07488 s to 282.366041 s max&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Lock Time &lt;span style="color:#f92672"&gt;(&lt;/span&gt;s&lt;span style="color:#f92672"&gt;)&lt;/span&gt; : 3168076.975558 s total, 123.820721 s avg, 108.548105 s to 311.639359 s max &lt;span style="color:#f92672"&gt;(&lt;/span&gt;98.45%&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 95% of Lock : 2961933.212121 s total, 121.860167 s avg, 108.548105 s to 123.487106 s max&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Rows sent : &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; avg, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; to &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; max &lt;span style="color:#f92672"&gt;(&lt;/span&gt;0.00%&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Rows examined : &lt;span style="color:#ae81ff"&gt;54&lt;/span&gt; avg, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; to 4.92k max &lt;span style="color:#f92672"&gt;(&lt;/span&gt;0.75%&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Database :&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Users :&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.147 : 10.65% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;2724&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 10.26% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;6215&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.209 : 10.33% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;2643&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 10.16% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;6156&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.205 : 10.16% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;2599&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.97% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;6036&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.211 : 10.13% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;2591&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.98% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;6042&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.207 : 9.93% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;2541&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.95% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;6024&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.161 : 9.83% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;2515&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.84% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;5960&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.149 : 9.81% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;2510&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.95% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;6028&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.215 : 9.76% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;2498&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.85% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;5963&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.168 : 9.71% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;2485&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.69% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;5868&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.213 : 9.69% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;2480&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.66% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;5851&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Query abstract:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SET timestamp&lt;span style="color:#f92672"&gt;=&lt;/span&gt;N; UPDATE connectinfo SET devicetag&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;, connectipaddress&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;, updatedatetime&lt;span style="color:#f92672"&gt;=&lt;/span&gt;now&lt;span style="color:#f92672"&gt;()&lt;/span&gt; WHERE ID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;N AND apptype&lt;span style="color:#f92672"&gt;=&lt;/span&gt;N;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Query sample:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SET timestamp&lt;span style="color:#f92672"&gt;=&lt;/span&gt;1443027797;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;update connectinfo set DeviceTag&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;1070A416AF000000&amp;#39;&lt;/span&gt;, ConnectIPAddress&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;60.174.116.165&amp;#39;&lt;/span&gt;, UpdateDatetime&lt;span style="color:#f92672"&gt;=&lt;/span&gt;now&lt;span style="color:#f92672"&gt;()&lt;/span&gt; where ID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5358&lt;/span&gt; and AppType&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;______________________________________________________________________ &lt;span style="color:#ae81ff"&gt;002&lt;/span&gt; ___&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Count : 32.79k &lt;span style="color:#f92672"&gt;(&lt;/span&gt;54.14%&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Time : 1344378.871914 s total, 40.99841 s avg, 2.000747 s to 1944.548192 s max &lt;span style="color:#f92672"&gt;(&lt;/span&gt;25.01%&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 95% of Time : 587407.556704 s total, 18.85678 s avg, 2.000747 s to 233.465042 s max&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Lock Time &lt;span style="color:#f92672"&gt;(&lt;/span&gt;s&lt;span style="color:#f92672"&gt;)&lt;/span&gt; : 1512.917798 s total, 46.138 ms avg, &lt;span style="color:#ae81ff"&gt;76&lt;/span&gt; ▒s to 114.302 ms max &lt;span style="color:#f92672"&gt;(&lt;/span&gt;0.05%&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 95% of Lock : 1414.978902 s total, 45.423 ms avg, &lt;span style="color:#ae81ff"&gt;76&lt;/span&gt; ▒s to 50.514 ms max&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Rows sent : &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; avg, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; to &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; max &lt;span style="color:#f92672"&gt;(&lt;/span&gt;0.15%&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Rows examined : 4.92k avg, 4.92k to 4.92k max &lt;span style="color:#f92672"&gt;(&lt;/span&gt;87.41%&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Database :&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Users :&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.209 : 10.24% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;3359&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 10.16% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;6156&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.149 : 10.16% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;3331&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.95% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;6028&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.147 : 10.11% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;3315&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 10.26% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;6215&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.211 : 10.03% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;3288&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.98% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;6042&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.207 : 10.02% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;3285&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.95% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;6024&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.161 : 9.97% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;3268&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.84% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;5960&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.215 : 9.96% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;3266&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.85% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;5963&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.205 : 9.92% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;3254&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.97% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;6036&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.168 : 9.86% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;3234&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.69% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;5868&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.213 : 9.73% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;3191&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.66% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;5851&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Query abstract:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SET timestamp&lt;span style="color:#f92672"&gt;=&lt;/span&gt;N; SELECT * FROM connectinfo WHERE ID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;N AND apptype&lt;span style="color:#f92672"&gt;=&lt;/span&gt;N ORDER BY createdatetime DESC LIMIT N;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Query sample:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SET timestamp&lt;span style="color:#f92672"&gt;=&lt;/span&gt;1443027795;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;select&lt;/span&gt; * from connectinfo where ID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;7646&lt;/span&gt; and AppType&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; ORDER BY CreateDatetime DESC LIMIT 1;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;______________________________________________________________________ &lt;span style="color:#ae81ff"&gt;003&lt;/span&gt; ___&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Count : &lt;span style="color:#ae81ff"&gt;842&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;1.39%&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Time : 66663.314786 s total, 79.172583 s avg, 2.011408 s to 673.604537 s max &lt;span style="color:#f92672"&gt;(&lt;/span&gt;1.24%&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 95% of Time : 56684.989954 s total, 70.944919 s avg, 2.011408 s to 193.623235 s max&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Lock Time &lt;span style="color:#f92672"&gt;(&lt;/span&gt;s&lt;span style="color:#f92672"&gt;)&lt;/span&gt; : 48221.988255 s total, 57.27077 s avg, &lt;span style="color:#ae81ff"&gt;69&lt;/span&gt; ▒s to 185.402303 s max &lt;span style="color:#f92672"&gt;(&lt;/span&gt;1.50%&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 95% of Lock : 40627.196184 s total, 50.847555 s avg, &lt;span style="color:#ae81ff"&gt;69&lt;/span&gt; ▒s to 166.67704 s max&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Rows sent : &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; avg, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; to &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; max &lt;span style="color:#f92672"&gt;(&lt;/span&gt;0.00%&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Rows examined : &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; avg, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; to &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; max &lt;span style="color:#f92672"&gt;(&lt;/span&gt;0.00%&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Database :&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Users :&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.207 : 11.64% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;98&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.95% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;6024&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.205 : 11.28% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;95&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.97% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;6036&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.213 : 10.93% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;92&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.66% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;5851&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.161 : 10.45% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;88&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.84% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;5960&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.149 : 10.33% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;87&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.95% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;6028&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.211 : 9.74% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;82&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.98% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;6042&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.147 : 9.38% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;79&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 10.26% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;6215&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.215 : 9.38% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;79&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.85% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;5963&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.168 : 9.03% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;76&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 9.69% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;5868&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xx@ 192.168.10.209 : 7.84% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;66&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of query, 10.16% &lt;span style="color:#f92672"&gt;(&lt;/span&gt;6156&lt;span style="color:#f92672"&gt;)&lt;/span&gt; of all users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Query abstract:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SET timestamp&lt;span style="color:#f92672"&gt;=&lt;/span&gt;N; INSERT INTO errormessage &lt;span style="color:#f92672"&gt;(&lt;/span&gt;id,servertype,msgtype,level,dev,content,eventtime,severname&lt;span style="color:#f92672"&gt;)&lt;/span&gt; VALUES &lt;span style="color:#f92672"&gt;(&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;1;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用mysqlsla可以看SQL语句的执行数量/比例，影响行数，用户，占比等。，从这里看很可能认为是connectinfo表（95%以上）引起，SHOW PROCESSLIST也是如此 。&lt;br&gt;&#10;由于这个文件我是单独下载回来的，运行mysqlsla.pl时候碰到很多错误，逐个安装解决了&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;vagrant@centos64 mysql-log-filter-1.9&lt;span style="color:#f92672"&gt;]&lt;/span&gt;$ perl mysqlsla.pl today.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Can&lt;span style="color:#e6db74"&gt;&amp;#39;t locate Time/HiRes.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at mysqlsla.pl line 2092.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;BEGIN failed--compilation aborted at mysqlsla.pl line 2092.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;#解决方法&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[vagrant@centos64 mysql-log-filter-1.9]$ sudo yum install perl-Time-HiRes&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[vagrant@centos64 mysql-log-filter-1.9]$ perl -MCPAN -e &amp;#39;&lt;/span&gt;install DBI&lt;span style="color:#e6db74"&gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Can&amp;#39;&lt;/span&gt;t locate CPAN.pm in @INC &lt;span style="color:#f92672"&gt;(&lt;/span&gt;@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .&lt;span style="color:#f92672"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;BEGIN failed--compilation aborted.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#解决方法&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;vagrant@centos64 mysql-log-filter-1.9&lt;span style="color:#f92672"&gt;]&lt;/span&gt;$ sudo yum install perl-DBI&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;正确的方法是应该检测对应根目录下面的Makefile.PL，比如&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;vagrant@centos64 percona-toolkit-2.2.15&lt;span style="color:#f92672"&gt;]&lt;/span&gt;$ perl Makefile.PL&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#如果报以下错误，需要先安装对应模块，简单点就是&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#sudo yum install perl-devel&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Can&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;t locate ExtUtils/MakeMaker.pm in @INC &lt;span style="color:#f92672"&gt;(&lt;/span&gt;@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .&lt;span style="color:#f92672"&gt;)&lt;/span&gt; at Makefile.PL line 1.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;BEGIN failed--compilation aborted at Makefile.PL line 1.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后安装对应模块，参考&lt;a class="link" href="http://modperlbook.org/html/3-9-1-Installing-Perl-Modules-into-a-Nonstandard-Directory.html" target="_blank" rel="noopener"&#10; &gt;这里&lt;/a&gt;。&lt;br&gt;&#10;使用Percona公司的工具&lt;a class="link" href="https://www.percona.com/doc/percona-toolkit/2.2/pt-query-digest.html" target="_blank" rel="noopener"&#10; &gt;pt-query-diges&lt;/a&gt;t来分析也得到了同mysqlsla类似的结果&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;vagrant@vagrant-centos64 bin&lt;span style="color:#f92672"&gt;]&lt;/span&gt;$ pt-query-digest ../../today4.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 9.8s user time, 700ms system time, 21.05M rss, 73.66M vsz&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Current date: Mon Oct 5 05:52:01 2015&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Hostname: vagrant-centos64.vagrantup.com&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Files: ../../today.log&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Overall: 60.57k total, 17 unique, 4.54 QPS, 402.68x concurrency ________&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Time range: 2015-09-23 22:17:29 to 2015-09-24 02:00:00&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Attribute total min max avg 95% stddev median&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ============ ======= ======= ======= ======= ======= ======= =======&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Exec time 5376198s 2s 2720s 89s 258s 118s 57s&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Lock time 3217840s 0 312s 53s 118s 60s 48ms&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Rows sent 20.85M 0 20.82M 361.00 0.99 84.46k 0.99&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Rows examine 175.91M 0 20.82M 2.97k 4.71k 84.48k 4.71k&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Query size 7.85M 64 597 135.90 151.03 27.56 112.70&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Profile&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Rank Query ID Response time Calls R/Call V/M Item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ==== ================== ================== ===== ======== ===== ========&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 1 0xF1132168DB0BFC57 3905525.5745 72.6% 25586 152.6431 61.61 UPDATE connectinfo&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 2 0xD4B317E755A0ABD7 1344378.8719 25.0% 32791 40.9984 30... SELECT connectinfo&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 3 0xE23849EE6FB19DAE 66663.3148 1.2% 842 79.1726 62.99 INSERT errormessage&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Query 1: 7.52 QPS, 1.15kx concurrency, ID 0xF1132168DB0BFC57 at byte 16243195&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# This item is included in the report because it matches --limit.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Scores: V/M = 61.61&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Time range: 2015-09-24 01:03:17 to 02:00:00&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Attribute pct total min max avg 95% stddev median&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ============ === ======= ======= ======= ======= ======= ======= =======&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Count 42 25586&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Exec time 72 3905526s 113s 2720s 153s 271s 97s 124s&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Lock time 98 3168077s 109s 312s 124s 118s 14s 118s&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Rows sent 0 0 0 0 0 0 0 0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Rows examine 0 1.33M 0 4.80k 54.39 0 504.65 0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Query size 48 3.78M 149 157 154.94 151.03 0.52 151.03&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# String:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Hosts 192.168.10.147 (2724/10%)... 9 more&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Users gate&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Query_time distribution&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 1us&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 10us&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 100us&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 1ms&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 10ms&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 100ms&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 1s&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 10s+ ################################################################&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Tables&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# SHOW TABLE STATUS LIKE &amp;#39;connectinfo&amp;#39;\G&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# SHOW CREATE TABLE `connectinfo`\G&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;update connectinfo set DeviceTag&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;10705BDDCD000000&amp;#39;&lt;/span&gt;, ConnectIPAddress&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;115.231.63.78&amp;#39;&lt;/span&gt;, UpdateDatetime&lt;span style="color:#f92672"&gt;=&lt;/span&gt;now&lt;span style="color:#f92672"&gt;()&lt;/span&gt; where ID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;6912&lt;/span&gt; and AppType&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0&lt;span style="color:#ae81ff"&gt;\G&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Converted for EXPLAIN&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# EXPLAIN /*!50100 PARTITIONS*/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;select&lt;/span&gt; DeviceTag&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;10705BDDCD000000&amp;#39;&lt;/span&gt;, ConnectIPAddress&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;115.231.63.78&amp;#39;&lt;/span&gt;, UpdateDatetime&lt;span style="color:#f92672"&gt;=&lt;/span&gt;now&lt;span style="color:#f92672"&gt;()&lt;/span&gt; from connectinfo where ID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;6912&lt;/span&gt; and AppType&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0&lt;span style="color:#ae81ff"&gt;\G&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;PS：这个问题解决后没几天，数据库又出问题，以为又是慢SQL什么的，结果是交换机网口问题。。。数据传输太慢，导致主从不同步。。。&lt;/p&gt;&#10;&lt;p&gt;参考链接：&lt;br&gt;&#10;&lt;a class="link" href="http://hzcsky.blog.51cto.com/1560073/479991" target="_blank" rel="noopener"&#10; &gt;mysql 慢日志分析&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://bbs.chinaunix.net/thread-4076473-1-1.html" target="_blank" rel="noopener"&#10; &gt;慢日志按时间截取&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://my.oschina.net/moooofly/blog/160201" target="_blank" rel="noopener"&#10; &gt;MySQL 之 slow log&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://www.cnblogs.com/zhanjindong/p/3472804.html" target="_blank" rel="noopener"&#10; &gt;MySQL优化—工欲善其事，必先利其器（2）&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://www.wllog.net/2014/09/02/744.html" target="_blank" rel="noopener"&#10; &gt;日志常用统计技巧&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://sunheran.com/2015/03/12/mysql-sql-performance/" target="_blank" rel="noopener"&#10; &gt;性能优化之MySQL优化（一）&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://blog.csdn.net/wyzxg/article/details/7268969" target="_blank" rel="noopener"&#10; &gt;mysqlsla的安装与使用&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://cocos.iteye.com/blog/1122836" target="_blank" rel="noopener"&#10; &gt;安装DBI组件。 Can’t locate DBI.pm in @INC-mysql接口&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="https://code.google.com/p/memcache-top/issues/detail?id=12" target="_blank" rel="noopener"&#10; &gt;Issue 12: Can’t locate Time/HiRes.pm&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://www.ccvita.com/326.html" target="_blank" rel="noopener"&#10; &gt;打开MySQL的慢查询记录&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://perl%20Makefile.PL" target="_blank" rel="noopener"&#10; &gt;“Can’t locate ExtUtils/MakeMaker.pm” while compile git&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://www.olindata.com/blog/2014/08/analysing-slow-mysql-queries-pt-query-digest" target="_blank" rel="noopener"&#10; &gt;analysing slow MySQL queries with pt-query-digest&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://tencentdba.com/blog/mysqldump-backup-principle/" target="_blank" rel="noopener"&#10; &gt;mysqldump备份原理&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://dba.stackexchange.com/questions/71961/mysqldump-single-transaction-yet-update-queries-are-waiting-for-the-backup" target="_blank" rel="noopener"&#10; &gt;mysqldump –single-transaction, yet update queries are waiting for the backup&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://blog.51yip.com/mysql/1042.html" target="_blank" rel="noopener"&#10; &gt;mysql 利用binlog增量备份，还原实例&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://bbs.chinaunix.net/thread-1017116-1-1.html" target="_blank" rel="noopener"&#10; &gt;MySQl备份恢复策略（完全+增量备份策略）&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>MySQL秒杀优化</title><link>https://courages.us/%E7%A7%92%E6%9D%80/</link><pubDate>Sun, 12 Jul 2015 17:08:24 +0800</pubDate><guid>https://courages.us/%E7%A7%92%E6%9D%80/</guid><description>&lt;p&gt;今天学习了&lt;a class="link" href="http://weibo.com/dbatools" target="_blank" rel="noopener"&#10; &gt;楼方鑫先生&lt;/a&gt;的 &lt;a class="link" href="http://www.infoq.com/cn/presentations/seckill-solution-based-sql" target="_blank" rel="noopener"&#10; &gt;《基于SQL的秒杀解决方案》&lt;/a&gt;，讲解了如何定位和优化秒杀业务中问题。&lt;br&gt;&#10;首先介绍了库存业务，库存可以分为前端库存，后端库存，实体库存。秒杀时，存在的主要问题&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;库存数据不准确，下单、付款后，得知零库存；超卖或少卖&lt;/li&gt;&#10;&lt;li&gt;废单较多，只下单不付款，转化率低&lt;/li&gt;&#10;&lt;li&gt;热点商品，拖垮整个站&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;秒杀过程中，需要解决的技术点包括&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;余额减一&lt;/li&gt;&#10;&lt;li&gt;操作明细，方便追溯对账，防止一个帐号多次参与&lt;/li&gt;&#10;&lt;li&gt;完整事务，保障记录明细与扣减库存同时完成&lt;/li&gt;&#10;&lt;li&gt;数据落地，内存数据不可靠&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;针对库存技术要求，做了多个库存解决方案，比如Mysql + Read /Write Cache 。Read Cache方案不足是读有延迟影响用户体验；Write Cache方案存在多个APP写数据不一致性。Mysql + Cache + NoSQL方案则太复杂未实现。&lt;/p&gt;&#10;&lt;p&gt;于是又重新回到优化Mysql上。Mysql优势在于事务机制成熟，程序稳定。存在技术难点：单行并发，热点商品，瞬间压力，前一分钟，千万用户，容易堵塞，拖垮网站。于是从以下几个方面进行优化&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;事务优化，单行更新&lt;/li&gt;&#10;&lt;li&gt;并发优化，最大并发数&lt;/li&gt;&#10;&lt;li&gt;排队优化，抢同一商品&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;分析秒杀时的处理逻辑，扫描系统代码，发现大部分程序都在等待确认Update记录数，才提交事务。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;开启事务&lt;/li&gt;&#10;&lt;li&gt;Insert库存明细&lt;/li&gt;&#10;&lt;li&gt;Update库存余额&lt;/li&gt;&#10;&lt;li&gt;提交事务&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;在良好设计下，Mysql的Insert操作，不使用自增列是不会阻塞请求。但是Mysql的Update同一条记录是串行的，需要等远程客户端发送提交命令后才能释放锁，让其他会话继续。简单的更新操作，不考虑IO和锁冲突，一条语句执行的时间大约是0.1ms，一般条件下的网络时延为0.4-0.8ms，即等待事务提交通知的时间比真正SQL执行的时间长数倍。&lt;br&gt;&#10;于是扩展了SQL语法（&lt;a class="link" href="http://www.onexsoft.com/onesql" target="_blank" rel="noopener"&#10; &gt;OneSQL&lt;/a&gt;），指定在Update执行完后自动提交，不需要等待客户端发送提交命令，从而节约这一个网络来回的事务等待时间，提升网络性能。&lt;/p&gt;&#10;&lt;p&gt;秒杀时如果遇到大量请求需要进行排队，以免太多的请求拖垮Mysql&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;在应用层排队的缺点，应用需要改造，使用统一框架（需要考虑跨语言)，应用集群扩容时，控制不准确（连接数分配）&lt;/li&gt;&#10;&lt;li&gt;在Mysql排队的优点，应用改造极少，只需修改少量SQL语句，无需统一框架，排队精确，发挥InnoDB性能。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;于是开发了兼容Mysql的分布式数据访问层（&lt;a class="link" href="http://www.onexsoft.com/oneproxy" target="_blank" rel="noopener"&#10; &gt;OneProxy&lt;/a&gt;），为并发请求进行排队。&lt;/p&gt;&#10;&lt;p&gt;另外，还对热点商品进行独立数据库拆分和优化。目前，双十一前商品便已挂出，用户可以收藏或预购，对于商家而言可以准备更多商品；对于平台而言可以预先发现热点商品做优化。&lt;/p&gt;&#10;&lt;p&gt;总结，对于业务优化，需要循序渐进，深入了解业务逻辑和技术点，比较不同的解决方案，就算是平常的update操作也有优化空间；同时需要从其他方面进行特定优化，如高并发排队，热点数据分离等。&lt;/p&gt;&#10;&lt;p&gt;除了后端数据库优化，对于秒杀抽奖业务，问题的解决核心就是控制单位时间内的流量，使其不超过后端的处理能力。前端的做法包括&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;分批次（少量多次)进行秒杀&lt;/li&gt;&#10;&lt;li&gt;先玩游戏再抢购，如抽奖&lt;/li&gt;&#10;&lt;li&gt;随机过滤掉部分请求，仅部分进入系统，如1/10&lt;/li&gt;&#10;&lt;li&gt;阈值控制，一旦达到阈值，不再接收新请求&lt;/li&gt;&#10;&lt;li&gt;预约排号，未排号用户返回失败（用户分类）&lt;/li&gt;&#10;&lt;li&gt;验证码验证&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;另外，&lt;a class="link" href="http://www.onexsoft.com/oneproxy/oneproxy-connection-pool" target="_blank" rel="noopener"&#10; &gt;OneProxy 提供的连接池功能&lt;/a&gt;对于PHP非常有用。PHP运行在CGI下面，每一个请求到来便需要重新创建一个数据库连接与Mysql进行交互，并发量大量的情况下便会出现：too many connetion，乃至拖垮数据库：mysql server has gone away，影响其他业务。因此Mysql连接池，对于PHP显得非常重要。&lt;/p&gt;&#10;&lt;p&gt;更新：&lt;a class="link" href="http://www.infoq.com/cn/presentations/the-use-of-minority-languages-in-venture-company" target="_blank" rel="noopener"&#10; &gt;小米网在开发抢购系统&lt;/a&gt;的时候，最早使用PHP + Mysql碰到了一些问题，例如并发性能，数据一致性，在OneSQL上面都已经做了改进优化，只是小米自己使用Go语言重构，开发大秒系统（BigTap）。&lt;/p&gt;&#10;&lt;p&gt;参考链接：&lt;br&gt;&#10;&lt;a class="link" href="http://www.iteye.com/problems/101435" target="_blank" rel="noopener"&#10; &gt;限量秒杀等高并发活动的正确性如何保证？&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://imysql.com/2014/06/07/mysql-percona-mariadb-onesql-tpcc-benchmark.shtml" target="_blank" rel="noopener"&#10; &gt;MySQL 5.6.17/Percona5.6.16/MariaDB 10.0.11/OneSQL 5.6.16 TpmC测试&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://coolshell.cn/articles/6470.html" target="_blank" rel="noopener"&#10; &gt;由12306.cn谈谈网站性能技术&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://www.csdn.net/article/2014-11-07/2822545" target="_blank" rel="noopener"&#10; &gt;“米粉节”背后的故事——小米网抢购系统开发实践&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://www.csdn.net/article/2014-11-28/2822858" target="_blank" rel="noopener"&#10; &gt;Web系统大规模并发——电商秒杀与抢购&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://www.onexsoft.com/oneproxy/oneproxy-connection-pool" target="_blank" rel="noopener"&#10; &gt;OneProxy : 如何给PHP页面以及其他Ruby/Python/Go程序添加连接池功能？&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="https://github.com/LinkedDestiny/swoole-doc/blob/master/03.Timer%E5%AE%9A%E6%97%B6%E5%99%A8%E3%80%81%E5%BF%83%E8%B7%B3%E6%A3%80%E6%B5%8B%E5%8F%8ATask%E8%BF%9B%E9%98%B6%E5%AE%9E%E4%BE%8B%EF%BC%9Amysql%E8%BF%9E%E6%8E%A5%E6%B1%A0.md" target="_blank" rel="noopener"&#10; &gt;基于Swoole实现的Mysql连接池&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>PHP安全问题</title><link>https://courages.us/php%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98/</link><pubDate>Fri, 29 Mar 2013 16:42:59 +0800</pubDate><guid>https://courages.us/php%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98/</guid><description>&lt;p&gt;在&lt;a class="link" href="http://wooyun.org/index.php" target="_blank" rel="noopener"&#10; &gt;乌云漏洞平台&lt;/a&gt;上发现很多开源PHP程序存在漏洞。大部分漏洞都是因为对PHP中的变量过滤不够严格和未转义造成，直接使用了$_GET，$_PUT，$_COOKIE传过来的值，造成了sql注入（sql injection）和跨站攻击（xss）。事实上这些漏洞完全可以避免的。&lt;br&gt;&#10;先说sql注入。通常注入情况发生在参数过滤不严谨和拼接sql，所以尽量不要用sql拼接，尽量使用PDO或Mysqli。&lt;/p&gt;&#10;&lt;p&gt;先看下面一段代码（test.php）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$database&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;test&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$duser&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;root&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$dpassword&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;*********&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$link&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;mysql_connect&lt;/span&gt;($server,$duser,$dpassword) &lt;span style="color:#66d9ef"&gt;or&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;die&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;连接不上服务器：&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;mysql_error&lt;/span&gt;());&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;mysql_select_db&lt;/span&gt;($database,$link) &lt;span style="color:#66d9ef"&gt;or&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;die&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;不能选择数据库&amp;#34;&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$id&lt;span style="color:#f92672"&gt;=&lt;/span&gt;$_GET[&lt;span style="color:#e6db74"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;];&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$sql&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;select id,account,nickname,password from user where id=&amp;#39;&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;$id&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; $sql;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$res&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;mysql_query&lt;/span&gt;($sql);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$arr&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;mysql_fetch_array&lt;/span&gt;($res,&lt;span style="color:#a6e22e"&gt;MYSQL_ASSOC&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后访问http://127.0.0.1/test.php?id=1，获取用户信息。这是可以通过构造参数进行攻击比如&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//访问：http://127.0.0.1/test.php?id=1%27%20OR%201%20=%201--%27&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//将可以查询出所有的表数据。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$sql&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;select id,account,nickname,password from user where id=&amp;#39;1&amp;#39; OR 1 = 1--&amp;#39;&amp;#39;&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//访问：http://127.0.0.1/test.php?id=1%27%20UNION%20ALL%20%28SELECT%20NULL,NULL,NULL,%27%3C?php%20system%28$_GET[%22command%22]%29;%20?%3E%27%20INTO%20OUTFILE%20%27D:/www/shell.php%27%29%20--%20-%27&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//在知道网站路径情况下，在网站目录下生成shell.php，将能够在对用户的网站进行挂马，提权的操作。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$sql&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;select id,account,nickname,password from user where id=&amp;#39;1&amp;#39; UNION ALL (SELECT NULL,NULL,NULL,&amp;#39;&amp;#39; INTO OUTFILE &amp;#39;D:/www/shell.php&amp;#39;) -- -&amp;#39;&amp;#39;&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;甚至还可以进行表数据的增加，修改，删除，数据库的删除！所以永远不要相信用户的输入，永远要过滤输入，转义输出。对传递过来的数字型变量要进行严格的匹配，对字符串型的变量进行长度限制。注意过滤用户传递过来的变量是否包含引号，/*，#，—等特殊字符或转义字符，script，drop，不要给用户超级权限，最好进行分隔。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//使用addslashes过滤单引号，双引号和斜杠&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$uname &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;addslashes&lt;/span&gt;( $_GET[&lt;span style="color:#e6db74"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;] );&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$query &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;SELECT username FROM users WHERE id = &amp;#34;&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;.&lt;/span&gt; $uname &lt;span style="color:#f92672"&gt;.&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;//使用mysql_real_escape_string过滤特殊字符，比如\x00, \n, \r, \, &amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;,&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\x1a&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;//mysql_real_escape_string使用的是本地单字节字符集，而我们传递多字节编码的变量时，有可能还是会造成SQL注入漏洞&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;//如chr(0xbf) . chr(0x27)，所以mysql服务端与php客户端通信尽量使用utf-8而不是gbk&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;$uname&lt;/span&gt;&lt;span style="color:#e6db74"&gt; = mysql_real_escape_string( &lt;/span&gt;&lt;span style="color:#e6db74"&gt;$_GET[&amp;#39;id&amp;#39;]&lt;/span&gt;&lt;span style="color:#e6db74"&gt; );&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;$query&lt;/span&gt;&lt;span style="color:#e6db74"&gt; = &amp;#39;SELECT username FROM users WHERE id = &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39; . $uname . &amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;//使用is_numeric检查数字型变量&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;$id&lt;/span&gt;&lt;span style="color:#e6db74"&gt; = &lt;/span&gt;&lt;span style="color:#e6db74"&gt;$_GET[&amp;#39;id&amp;#39;]&lt;/span&gt;&lt;span style="color:#e6db74"&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;( is_numeric( &lt;/span&gt;&lt;span style="color:#e6db74"&gt;$id&lt;/span&gt;&lt;span style="color:#e6db74"&gt; ) ? TRUE : FALSE );&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;//使用sprintf格式化数字型变量&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;$id&lt;/span&gt;&lt;span style="color:#e6db74"&gt; = &lt;/span&gt;&lt;span style="color:#e6db74"&gt;$_GET[&amp;#39;id&amp;#39;]&lt;/span&gt;&lt;span style="color:#e6db74"&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;$query&lt;/span&gt;&lt;span style="color:#e6db74"&gt; = sprintf(&amp;#34;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;SELECT&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;username&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FROM&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;users&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;WHERE&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;%d&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;, &lt;/span&gt;&lt;span style="color:#e6db74"&gt;$id&lt;/span&gt;&lt;span style="color:#e6db74"&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;//使用htmlentities(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;$var&lt;/span&gt;&lt;span style="color:#e6db74"&gt;, ENT_QUOTES)转义所有的html标记&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;$id&lt;/span&gt;&lt;span style="color:#e6db74"&gt; = &lt;/span&gt;&lt;span style="color:#e6db74"&gt;$_GET[&amp;#39;id&amp;#39;]&lt;/span&gt;&lt;span style="color:#e6db74"&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;$id&lt;/span&gt;&lt;span style="color:#e6db74"&gt; = htmlentities( &lt;/span&gt;&lt;span style="color:#e6db74"&gt;$id&lt;/span&gt;&lt;span style="color:#e6db74"&gt;, ENT_QUOTES, &amp;#39;UTF-8&amp;#39; );&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;$query&lt;/span&gt;&lt;span style="color:#e6db74"&gt; = &amp;#39;SELECT username FROM users WHERE id = &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39; . $id . &amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#39;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;//使用filter_var过滤script标签，防止xss&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;&lt;span style="color:#e6db74"&gt;$str&lt;/span&gt;&lt;span style="color:#e6db74"&gt; = strip_tags(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;$input&lt;/span&gt;&lt;span style="color:#e6db74"&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;$str&lt;/span&gt;&lt;span style="color:#e6db74"&gt; = filter_var(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;$input&lt;/span&gt;&lt;span style="color:#e6db74"&gt;, FILTER_SANITIZE_STRING);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果PHP支持PDO可以的话，就不要拼接sql，尽量使用PDO或Mysqli。使用PDO要在PDO的DSN中指定charset属性，要设置PDO::ATTR_EMULATE_PREPARES参数为false，禁止php进行本地转义，造成双字节转义攻击，如果没有必要，msyql服务端与php客户端应该都是用utf-8进行通信，而不是gbk。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$pdo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PDO&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;mysql:host=192.168.0.1;dbname=test;&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;root&amp;#34;&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$pdo&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;setAttribute&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;PDO&lt;/span&gt;&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;ATTR_EMULATE_PREPARES&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$st &lt;span style="color:#f92672"&gt;=&lt;/span&gt; $pdo&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;prepare&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;select * from info where id =? and name = ?&amp;#34;&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;21&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;zhangsan&amp;#39;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$st&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;bindParam&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,$id);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$st&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;bindParam&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;,$name);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$st&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;execute&lt;/span&gt;();&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$st&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;fetchAll&lt;/span&gt;();&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;除了过滤，变量务必初始化，不要自动获得变量，用户将可以构造任何变量进行攻击。&lt;br&gt;&#10;不要这样随意，将造成文件包含攻击&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;($_GET[&lt;span style="color:#e6db74"&gt;&amp;#39;page&amp;#39;&lt;/span&gt;]) {&lt;span style="color:#75715e"&gt;//if(file_exists($_GET[&amp;#39;page&amp;#39;])) {非严格的检测 http://localhost/index.php?page=/etc/passwd%00&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;include&lt;/span&gt;($_GET[&lt;span style="color:#e6db74"&gt;&amp;#39;page&amp;#39;&lt;/span&gt;]);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;要进行严格的匹配，或者做映射&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;($_GET[&lt;span style="color:#e6db74"&gt;&amp;#39;page&amp;#39;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;news&amp;#39;&lt;/span&gt;) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;include&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;news.php&amp;#39;&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;关闭浏览器输出的错误报告，避免泄漏文件目录路径，错误报告应输出到日记文件中&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;#php.ini&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;display_errors = &amp;#39;off&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;#apache2.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;php_flag display_errors off&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;php当中&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ini_set&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;display_errors&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;页面的访问要设置权限，特别是执行查询的或者录入的页面，简单设置如下&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;define&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;APP_ADMIN&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;defined&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;APP_ADMIN&amp;#39;&lt;/span&gt;)) &lt;span style="color:#66d9ef"&gt;exit&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;应该做一个更为完善的权限系统，如基于角色的权限管理系统，最好细致到页面（元素）。&lt;br&gt;&#10;eval函数针对php安全有很大杀伤力，为了防止挂马，应禁用eval函数。&lt;br&gt;&#10;下载的页面必须设置下载目录，对要下载的文件进行检测或做目录权限控制，生成临时下载链接，不允许下载任意的文件。对于系统配置文件，日记文件等要做分离，建议像zend framework那样设置web目录，程序与web目录分开，避免泄漏源码等。不要将.svn文件直接放置在web目录，会导致源码泄露。&lt;br&gt;&#10;上传的页面必须进行类型检测，不要只截取扩展名，设置权限，不允许可执行文件。这里是网友写的一个文件类型检查类&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*通过文件名，获得文件类型*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; *@author chengmo QQ:8292669*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; *@copyright &amp;lt;a href=&amp;#34;http://www.cnblogs.com/chengmo&amp;#34;&amp;gt;http://www.cnblogs.com/chengmo&amp;lt;/a&amp;gt; 2010-10-17&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; *@version 0.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; *$filename=&amp;#34;d:/1.png&amp;#34;;echo cFileTypeCheck::getFileType($filename); 打印：png&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;cFileTypeCheck&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; $_TypeList&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;();&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; $CheckClass&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__construct&lt;/span&gt;($filename)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;::&lt;/span&gt;$_TypeList&lt;span style="color:#f92672"&gt;=&lt;/span&gt;$this&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;getTypeList&lt;/span&gt;();&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; *处理文件类型映射关系表*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; *&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * @param string $filename 文件类型&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * @return string 文件类型，没有找到返回：other&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;_getFileType&lt;/span&gt;($filename)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $filetype&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;other&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;file_exists&lt;/span&gt;($filename)) &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Exception&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;no found file!&amp;#34;&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $file &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;@&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;fopen&lt;/span&gt;($filename,&lt;span style="color:#e6db74"&gt;&amp;#34;rb&amp;#34;&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;$file) &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Exception&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;file refuse!&amp;#34;&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $bin &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fread&lt;/span&gt;($file, &lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;); &lt;span style="color:#75715e"&gt;//只读15字节 各个不同文件类型，头信息不一样。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fclose&lt;/span&gt;($file);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $typelist&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;::&lt;/span&gt;$_TypeList;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;foreach&lt;/span&gt; ($typelist &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; $v)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $blen&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;strlen&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;pack&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;H*&amp;#34;&lt;/span&gt;,$v[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;])); &lt;span style="color:#75715e"&gt;//得到文件头标记字节数&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $tbin&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;substr&lt;/span&gt;($bin,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;intval&lt;/span&gt;($blen)); &lt;span style="color:#75715e"&gt;///需要比较文件头长度&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;strtolower&lt;/span&gt;($v[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;])&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;strtolower&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;array_shift&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;unpack&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;H*&amp;#34;&lt;/span&gt;,$tbin)))) &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; $v[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; $filetype;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; *得到文件头与文件类型映射表*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; *&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * @return array array(array(&amp;#39;key&amp;#39;,value)...)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getTypeList&lt;/span&gt;()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;FFD8FFE1&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;jpg&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;89504E47&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;png&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;47494638&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;gif&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;49492A00&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;tif&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;424D&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;bmp&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;41433130&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;dwg&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;38425053&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;psd&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;7B5C727466&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;rtf&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;3C3F786D6C&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;xml&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;68746D6C3E&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;html&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;44656C69766572792D646174&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;eml&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;CFAD12FEC5FD746F&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;dbx&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;2142444E&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;pst&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;D0CF11E0&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;xls/doc&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;5374616E64617264204A&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;mdb&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;FF575043&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;wpd&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;252150532D41646F6265&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;eps/ps&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;255044462D312E&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;pdf&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;E3828596&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;pwl&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;504B0304&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;zip&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;52617221&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;rar&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;57415645&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;wav&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;41564920&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;avi&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;2E7261FD&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;ram&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;2E524D46&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;rm&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;000001BA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;mpg&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;000001B3&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;mpg&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;6D6F6F76&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;mov&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;3026B2758E66CF11&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;asf&amp;#34;&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;4D546864&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;mid&amp;#34;&lt;/span&gt;));&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getFileType&lt;/span&gt;($filename)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;::&lt;/span&gt;$CheckClass) &lt;span style="color:#a6e22e"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;::&lt;/span&gt;$CheckClass&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;self&lt;/span&gt;($filename);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $class&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;::&lt;/span&gt;$CheckClass;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; $class&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;_getFileType&lt;/span&gt;($filename);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$filename&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;22.jpg&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; $filename,&lt;span style="color:#e6db74"&gt;&amp;#34;t&amp;#34;&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;cFileTypeCheck&lt;/span&gt;&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;getFileType&lt;/span&gt;($filename),&lt;span style="color:#e6db74"&gt;&amp;#34;rn&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$filename&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;11.doc&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; $filename,&lt;span style="color:#e6db74"&gt;&amp;#34;t&amp;#34;&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;cFileTypeCheck&lt;/span&gt;&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;getFileType&lt;/span&gt;($filename),&lt;span style="color:#e6db74"&gt;&amp;#34;rn&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;对于暴力破解设置验证码，或者限制ip次数。&lt;/p&gt;&#10;&lt;p&gt;参考链接：&lt;br&gt;&#10;&lt;a class="link" href="http://www.unixwiz.net/techtips/sql-injection.html" target="_blank" rel="noopener"&#10; &gt;SQL Injection Attacks by Example&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://hakipedia.com/index.php/SQL_Injection" target="_blank" rel="noopener"&#10; &gt;SQL Injection&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://www.websec.ca/kb/sql_injection" target="_blank" rel="noopener"&#10; &gt;Injection&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://php.net/manual/en/security.database.sql-injection.php" target="_blank" rel="noopener"&#10; &gt;PHP SQL Injection&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://hi.baidu.com/thinkinginlamp/item/8fe5a5bb41f4c3422aebe3fb" target="_blank" rel="noopener"&#10; &gt;PHP+MySQL环境下SQL Injection攻防总结&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://zhangxugg-163-com.iteye.com/blog/1835721" target="_blank" rel="noopener"&#10; &gt;PDO防注入原理分析以及使用PDO的注意事项&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string" target="_blank" rel="noopener"&#10; &gt;SQL injection that gets around mysql_real_escape_string()&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://www.i0day.com/788.html" target="_blank" rel="noopener"&#10; &gt;MySQL远程提权php版&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet" target="_blank" rel="noopener"&#10; &gt;XSS Filter Evasion Cheat Sheet&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://www.cnblogs.com/chengmo/archive/2010/10/17/1853710.html" target="_blank" rel="noopener"&#10; &gt;php通过文件头检测文件类型通用类（zip,rar…)&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://www.cnblogs.com/chengmo/archive/2010/12/06/1898062.html" target="_blank" rel="noopener"&#10; &gt;php 验证码【倾斜，正弦干扰线，黏贴，旋转&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>