PHP http://indrupal.com/index.php/ zh-hans 探索 AI 前沿,共赴开源盛宴,中国Drupal社区在线聚会(网络Meeting)来了! http://indrupal.com/index.php/AI-2024 <span>探索 AI 前沿,共赴开源盛宴,中国Drupal社区在线聚会(网络Meeting)来了!</span> <span><span>yunke</span></span> <span><time datetime="2024-06-24T08:58:17+08:00" title="2024-06-24 08:58 星期一">周一, 06/24/2024 - 08:58</time> </span> <div class="text-content clearfix field field--name-body field--type-text-with-summary field--label-hidden field__item"><h1 class="text-align-center"><strong>在线AI知识分享会</strong></h1><p><strong>尊敬的人工智能(AI)爱好者朋友们:</strong></p><p>本周五(2024 年 6 月 28 日)晚上 7:30,中国开源软件社区(Drupal社区)将进行一场公益在线聚会,分享干货、强调公益、杜绝广告。</p><p>AI 正以前所未有的速度改变着我们的世界,本次网络分享会将聚焦于人工智能(AI)这一热门话题,我们有幸邀请到了多位在人工智能领域的实践探索者(见后),他们将带来宝贵的探索成果和实践经验,这不仅是一场技术的交流,更是一次思想的碰撞。</p><p>软件是AI的载体,同时也将组织社区成员探讨分享 AI 在开源软件领域的无限可能。无论您是资深的开发者,还是刚刚踏入技术领域的新手;无论您是对 AI 充满好奇,还是正在寻求技术应用,这场聚会都将为您提供宝贵的学习和交流机会。<br /><br />重点是:这是一场纯公益的活动,没有任何营销目的!我们的初衷就是为了汇聚大家的智慧,及时分享前沿信息,共同推动中国开源软件事业的发展。</p><p class="text-align-right">——中国 Drupal 开源软件社区<br />                  2024 年 6 月</p><p><strong>分享嘉宾</strong>(嘉宾报名或嘉宾推荐请加微信:indrupal):</p><ul><li><strong>云客,分享主题《深度思考 · AI哲学》</strong><br />嘉宾介绍:未来很美科技创始人,Drupal开源软件社区贡献者</li><li><strong>牛强,分享主题《生成式人工智能的繁荣与困境》</strong><br />嘉宾介绍:资深系统工程师,现就职于商汤科技,躬耕于人工智能行业,曾就职于戴文、哔哩哔哩等公司。因 Drupal 结缘、入局互联网,从 12 年使用至今,依旧是 Drupal 拥趸</li><li><strong>赵高欣,分享主题《AI生成思维导图和知识图谱》</strong><br />嘉宾介绍:晓安科技CEO,Drupal贡献者、Drupal资深开发者。</li><li><strong>刘明伟,分享主题《AI与教育》</strong><br />嘉宾介绍:重庆医科大学教授,研究生导师,国家医科大学类教材总编</li></ul><p>分享嘉宾推荐或自荐请联系会务微信:indrupal,注意:本场聚会为公益性聚会,禁止广告和营销</p><p><strong>会议流程:</strong></p><ol><li>通过网络会议链接入会,6月28日(周五)19:30分正式开始,请提前进入</li><li>主持人对会议、AI、开源软件社区做简要介绍</li><li>嘉宾分享</li><li>提问咨询</li><li>自由探讨交流</li></ol><p><br /><strong>入会方式:</strong><br />本次聚会采用在线网络会议方式,会议链接如下(直接打开相关网址即可,无需下载安装会议软件):</p><p>【</p><p>   Drupal社区 邀请您参加“开源软件社区在线AI知识分享会”    <br />    <br />  会议号:763 487 590    <br />  会议主题:开源软件社区在线AI知识分享会    <br />  会议时间:2024-06-28 19:30     <br />  会议时长:120分钟     <br />  会议链接:<a href="https://meet.will-nice.com/meeting_web?code=763487590" target="_blank">https://meet.will-nice.com/meeting_web?code=763487590</a>    <br />    <br />  微信中推荐使用小程序会议链接:    <br />  <a href="https://wxaurl.cn/bPKRyP4aUgo" target="_blank">https://wxaurl.cn/bPKRyP4aUgo</a></p><p>  诚邀您的加入,未来很美会议系统!</p><p>】</p><p>会务及帮助请扫码加聚会微信群,更新信息将在群内及时发布:</p><p class="text-align-center"><img src="/sites/default/files/renew/AI2024/DrupalMeeting.jpg" width="1031" height="1449" data-entity-type="file" data-entity-uuid="f78e9c19-f8d7-4ad2-a6ee-50897eb5497f" alt="" loading="lazy" /></p><p> </p><p> </p><p> </p><p><br /><br /> </p></div> <section data-drupal-selector="comments" class="comments"> <h2 class="comments__title">交流互动</h2> <div class="add-comment"> <div class="add-comment__form"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=417&amp;2=comment&amp;3=comment" token="H8a6na0KflBI9qIdgRzvzhyDXG1MiY9eSUBX-lVnCpg"></drupal-render-placeholder> </div> </div> </section> Mon, 24 Jun 2024 00:58:17 +0000 yunke 417 at http://indrupal.com 如何清理Drupal主机储存空间 http://indrupal.com/index.php/node/411 <span>如何清理Drupal主机储存空间</span> <span><span>yunke</span></span> <span><time datetime="2023-11-22T11:12:56+08:00" title="2023-11-22 11:12 星期三">周三, 11/22/2023 - 11:12</time> </span> <div class="text-content clearfix field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>双十一刚过,阿里云等等平台推出了比较优惠的云主机,但储存空间只有40GB,这也导致许多Drupal学员因为储存空间问题产生困扰,刚装时好好的,运行一段时间后怎么储存空间就不够用了?本文针对主要问题教你清理储存空间。</p><p>当主机储存空间爆满后,Drupal网站在设置为不显示错误详情时,会提示遇到不可知问题无法访问,连后台都进入不了,此时可以远程登录服务器,删除一些不要的文件,这样就可以短暂恢复访问了,因此平时可以放几百兆的无用文件在服务器上,以应对这个问题。</p><p><strong>删除及禁用Drupal缓存:</strong></p><p>然后马上登录网站后台,去删除缓存(管理-配置-开发-性能-清空所有缓存),缓存是Drupal储存空间的消耗大户,耗费空间的主要原因之一,存在目的是加速网站访问,以空间换时间,如果你实在不想增加储存空间,缓存又增长过快,那么可以禁用缓存,这里以最大的页面缓存(缓存表为:cache_page)为例来讲解如何做:</p><p>打开配置文件(默认为sites\default\settings.php),在末尾加上这一行:</p><pre><code class="language-plaintext">$settings['cache']['bins']['page']="cache.backend.memory";</code></pre><p>这代表将page缓存储存到内存中去,这样就不会占用硬盘空间了(实际上更好的办法是储存到NULL缓存中去,但系统没有提供现成的服务,不过提供有NULL缓存类,可以去自定义一个NULL缓存服务)</p><p><strong>禁用数据库二进制日志:</strong></p><p>另一个储存空间消耗大户就是数据库的二进制日志文件,可以达到几十GB,在MYSQL 8.0中默认是开启的</p><p>首先将Mysql添加到系统环境变量中去,假设用的是Win服务器,可以右击“此电脑”,然后选:属性-高级系统设置-环境变量-找到Path然后点击编辑,将mysql的安装路径添加进去,最后保存</p><p>打开命令行终端登录数据库 &nbsp;:</p><pre><code class="language-plaintext">mysql -u root -p</code></pre><p>接着输入密码进入</p><p>查询二进制日志是否处于打开状态:</p><pre><code class="language-plaintext">SHOW VARIABLES LIKE 'log_bin';</code></pre><p>如果是打开的,那么删除这些二进制日志(在开启二进制日志的情况下才有效),命令如下:</p><pre><code class="language-plaintext">RESET MASTER;</code></pre><p>长久关闭二进制日志,打开数据库配置文件(my.ini),添加:</p><pre><code class="language-plaintext">skip-log-bin或disable-log-bin</code></pre><p>然后重启,暂停二进制日志可以使用以下命令:</p><pre><code class="language-plaintext">SET SQL_LOG_BIN=0;</code></pre><p>&nbsp;</p><p>以上是耗费空间的两个主要原因,通过如上处理,Drupal服务器的大部分储存空间就清理出来了</p><p>&nbsp;</p><p>&nbsp;</p></div> <section data-drupal-selector="comments" class="comments"> <h2 class="comments__title">交流互动</h2> <div class="add-comment"> <div class="add-comment__form"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=411&amp;2=comment&amp;3=comment" token="g0oEmheXRX1D3iWvm3XKDV53Tx0C_avnEcbOqa5wDTI"></drupal-render-placeholder> </div> </div> </section> Wed, 22 Nov 2023 03:12:56 +0000 yunke 411 at http://indrupal.com http://indrupal.com/index.php/node/411#comments 为什么有时候开发难以按预期完成? http://indrupal.com/index.php/node/410 <span>为什么有时候开发难以按预期完成?</span> <span><span>yunke</span></span> <span><time datetime="2023-08-26T11:21:26+08:00" title="2023-08-26 11:21 星期六">周六, 08/26/2023 - 11:21</time> </span> <div class="text-content clearfix field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>水滴间网站现已升级到Drupal10,默认主题已随之切换为olivero主题,这里以升级过程中遇到的一个问题来说明:为什么有时候开发难以按预期完成,问题描述如下:</p><h5 class="text-align-center">BigPipe模块导致olivero主题在导航菜单中,点击搜索图标不弹出搜索表单的问题</h5><p>升级Drupal 10 后,发现点击导航栏中的搜索放大镜图标无法弹出搜索表单,浏览器控制台显示以下错误:</p><pre><code class="language-plaintext">Uncaught TypeError: Cannot read properties of null (reading 'classList')</code></pre><p>排查过程如下:&nbsp;<br>最直接的原因是web\core\themes\olivero\js\search.js文件的第10-12行代码:</p><pre><code class="language-javascript"> const searchWideWrapperSelector ='[data-drupal-selector="block-search-wide-wrapper"]'; const searchWideWrapper = document.querySelector(searchWideWrapperSelector);</code></pre><p>无法找到这个搜索表单包装元素,但在浏览器控制台中查看是有这个元素的</p><p>然后查看源代码,发现这个搜索表单元素被BigPipe模块做了处理,此时你需要知道BigPipe模块的作用:</p><p>它将不耗时的静态内容先发送给浏览器,以便浏览器尽快有所显示,避免用户等待着急,而将页面中耗时的动态内容先用占位符替换,等浏览器渲染完页面后,再从后端拉取那些动态内容来替换之前放置的相应占位符。</p><p>换句话说:BigPipe模块就是将内容分批发送,以便浏览器尽快显示,而传统方式是将内容一次性发送,这样做的目的是尽可能快的显示页面,提高用户体验。</p><p>之所以搜索js找不到表单包装元素而浏览器控制台中能看到,就是因为查找时机发生在动态内容替换占位符之前,此时尚未替换,当然就找不到,所以报错无法弹出搜索表单了。</p><p>那么BigPipe模块为什么要把搜索表单识别成动态内容加以处理呢?默认情况下是不会这样的,进一步排查,是因为“yunke_captcha”模块为所有的表单元素添加了缓存元数据(这样做的目的是验证码配置变动后及时让表单响应更新,逻辑上是没有问题的),正是因为向表单元素添加了缓存元数据这个动作,导致了BigPipe模块将搜索表单元素识别为动态内容,从而进行了处理,进而导致了搜索表单无法弹出。</p><p>一个JS错误,想不到会牵扯到两个模块和缓存系统。</p><p>这是一个非常典型的故障排除案例,一个小故障导致一连窜的分析检查,所以,为什么说开发有时候难以按预期完成进度?就是因为不知道有什么坑在前方等着,也不知道会为此耗去多少时间去查阅那些本不用查阅的资料</p><p>目前“yunke_captcha”模块已对该问题做了规避,为此发布了2.4版本</p><p>但该问题并不是“yunke_captcha”模块的bug,而是olivero主题和BigPipe模块需要改进,尤其是BigPipe模块需要添加排除处理的方法,云客针对该问题已向Drupal官方提交修复建议</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p></div> <section data-drupal-selector="comments" class="comments"> <h2 class="comments__title">交流互动</h2> <div class="add-comment"> <div class="add-comment__form"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=410&amp;2=comment&amp;3=comment" token="oOijBNrAcwacW5Jzi9cdJXhDUcT6-I1gZG11Qg1hiRA"></drupal-render-placeholder> </div> </div> </section> Sat, 26 Aug 2023 03:21:26 +0000 yunke 410 at http://indrupal.com http://indrupal.com/index.php/node/410#comments Drupal 9 升级到 Drupal 10 干货详解 http://indrupal.com/index.php/node/408 <span>Drupal 9 升级到 Drupal 10 干货详解</span> <span><span>yunke</span></span> <span><time datetime="2023-08-23T19:15:04+08:00" title="2023-08-23 19:15 星期三">周三, 08/23/2023 - 19:15</time> </span> <div class="text-content clearfix field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>首先,升级到Drupal 10前,需要先升级到Drupal 9.5 ,升级到Drupal 9.5比较容易,属于大版本内升级,具体过程这里略过</p> <p>升级到Drupal 9.5后,安装CKEditor 5模块,并在“管理-配置-内容写作-文本格式和编辑器”中,在用到富文本编辑器的条目中,手动更新CKEditor 4 到 CKEditor 5</p> <p>然后,如果安装了以下这些被弃用的模块,那么卸载它们:</p> <ul> <li>CKEditor (CKEditor 4)</li> <li>Color</li> <li>RDF</li> <li>Quick Edit</li> <li>HAL</li> </ul> <p>安装启用新的默认主题并重新设置主题,卸载弃用的主题</p> <p>接着升级所有模块到兼容D10,然后运行下方命令升级核心到Drupal 10:</p> <pre> <code class="language-bash">composer require drupal/core-recommended:10.0.0 drupal/core-composer-scaffold:10.0.0 drupal/core-project-message:10.0.0 --update-with-all-dependencies</code></pre> <p>现在代码库已经升级到D10了,接着升级数据库:<br /> 先修改配置文件(settings.php)中的:$settings['update_free_access'] 项的值为TRUE,这样将允许你在不登录维护账号的情况下也能执行升级脚本,后续完成升级后记得改回: false<br /> 运行升级脚本:update.php</p> <p>顺利的话,现在你已经升级到Drupal 10了,可以继续升级到最新版本的Drupal 10</p> <p>现在做一些升级完成的善后工作:<br /> 1、使用Apache的用户注意:.htaccess 文件有改变,需要在新的文件上手动添加自定义的部分内容<br /> 2、默认的robots.txt文件已更新为不允许索引oEmbed媒体链接,替换该文件,有自定义部分则手动合并<br /> 3、站点services.yml文件有更新,需要手动合并<br /> 4、修改前述$settings['update_free_access'] 项的值为false<br /> 5、进入系统后台,查看状态报告页面以及日志页面,看是否有其他问题,一并修复</p> <p><strong>Drupal 10 运行环境要求:</strong><br /> php版本需要:PHP 8.1或者更高<br /> 由于 8.1.0 到 8.1.5有一个OPcache方面的bug,所以推荐8.1.6以上版本</p> <p>数据库:<br /> MySQL 或 Percona 5.7.8.<br /> MariaDB 10.3.7</p> <p>浏览器支持:<br /> Internet Explorer 11不再被支持</p> <p>Composer要求:<br /> Drupal 10推荐Composer版本在2.3.6或更高</p> <p>&nbsp;</p> <p><strong>补充说明:</strong><br /> 1、在不卸载模块的情况下,如果你需要移动模块位置,可以直接移动,然后运行一次升级脚本即可<br /> 注:如果是卸载方式移动会导致模块配置丢失,在有复杂依赖时,情况更糟,此知识点可以帮你避免这一点</p> <p>2、官方升级指导页:<br /> https://www.drupal.org/project/drupal/releases/10.0.0</p> <p>&nbsp;</p> <p>&nbsp;</p> </div> <section data-drupal-selector="comments" class="comments"> <h2 class="comments__title">交流互动</h2> <div class="add-comment"> <div class="add-comment__form"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=408&amp;2=comment&amp;3=comment" token="1FLCSGVj7xXhPvRbOQmZwOODH-n4t0MiFgzaleT8XXk"></drupal-render-placeholder> </div> </div> </section> Wed, 23 Aug 2023 11:15:04 +0000 yunke 408 at http://indrupal.com http://indrupal.com/index.php/node/408#comments 在不卸载Drupal模块的情况下,如何移动更改模块所在的目录? http://indrupal.com/index.php/node/407 <span>在不卸载Drupal模块的情况下,如何移动更改模块所在的目录?</span> <span><span>yunke</span></span> <span><time datetime="2023-08-22T16:21:50+08:00" title="2023-08-22 16:21 星期二">周二, 08/22/2023 - 16:21</time> </span> <div class="text-content clearfix field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>在有些情况下,我们需要移动Drupal模块所在的目录,比如开始使用Composer管理系统代码,或者将某个单站的模块用于多站时</p> <p>如果你直接移动模块文件夹,那么系统会提示错误,日志里面会记录XX文件不存在,导致进不了后台</p> <p>如果你卸载模块重新安装,那么模块的配置或数据就会丢失,在有很多模块依赖本模块时,更加复杂,需要修改太多内容</p> <p>那怎么办呢?</p> <p>其实很简单,你只需要移动模块后,运行一次“/update.php”升级程序即可</p> </div> <section data-drupal-selector="comments" class="comments"> <h2 class="comments__title">交流互动</h2> <div class="add-comment"> <div class="add-comment__form"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=407&amp;2=comment&amp;3=comment" token="Co8H6fqyn-6fBn70WxqmB1nO_JQA3iQA4qujWtQzLjk"></drupal-render-placeholder> </div> </div> </section> Tue, 22 Aug 2023 08:21:50 +0000 yunke 407 at http://indrupal.com http://indrupal.com/index.php/node/407#comments 使用数据库工具Navicat备份还原Drupal数据库的注意事项 http://indrupal.com/index.php/node/404 <span>使用数据库工具Navicat备份还原Drupal数据库的注意事项</span> <span><span>yunke</span></span> <span><time datetime="2023-08-11T15:40:13+08:00" title="2023-08-11 15:40 星期五">周五, 08/11/2023 - 15:40</time> </span> <div class="text-content clearfix field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>在用Navicat数据库工具还原之前备份的Drupal数据库后,访问日志页面(/admin/reports/dblog),出现如下错误:</p> <pre> <code>网站遇到了不可预知的错误。请稍后再试。 Error: Call to a member function getCacheMaxAge() on null in Drupal\views\Plugin\views\query\Sql-&gt;getCacheMaxAge() (line 1710 of core\modules\views\src\Plugin\views\query\Sql.php). Drupal\views\Plugin\views\cache\CachePluginBase-&gt;getCacheMaxAge() (Line: 672) Drupal\views\Plugin\views\style\StylePluginBase-&gt;renderFields(Array) (Line: 570) Drupal\views\Plugin\views\style\StylePluginBase-&gt;renderGrouping(Array, Array, 1) (Line: 458) Drupal\views\Plugin\views\style\StylePluginBase-&gt;render(Array) (Line: 2181) Drupal\views\Plugin\views\display\DisplayPluginBase-&gt;render() (Line: 1548) Drupal\views\ViewExecutable-&gt;render() (Line: 199) Drupal\views\Plugin\views\display\Page-&gt;execute() (Line: 1645) Drupal\views\ViewExecutable-&gt;executeDisplay('page', Array) (Line: 81) Drupal\views\Element\View::preRenderViewElement(Array) call_user_func_array(Array, Array) (Line: 111) Drupal\Core\Render\Renderer-&gt;doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer-&gt;doCallback('#pre_render', Array, Array) (Line: 377) Drupal\Core\Render\Renderer-&gt;doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer-&gt;render(Array, ) (Line: 238) Drupal\Core\Render\MainContent\HtmlRenderer-&gt;Drupal\Core\Render\MainContent\{closure}() (Line: 583) Drupal\Core\Render\Renderer-&gt;executeInRenderContext(Object, Object) (Line: 231) Drupal\Core\Render\MainContent\HtmlRenderer-&gt;prepare(Array, Object, Object) (Line: 128) Drupal\Core\Render\MainContent\HtmlRenderer-&gt;renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber-&gt;onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 111) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher-&gt;dispatch(Object, 'kernel.view') (Line: 171) Symfony\Component\HttpKernel\HttpKernel-&gt;handleRaw(Object, 1) (Line: 74) Symfony\Component\HttpKernel\HttpKernel-&gt;handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session-&gt;handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle-&gt;handle(Object, 1, 1) (Line: 106) Drupal\page_cache\StackMiddleware\PageCache-&gt;pass(Object, 1, 1) (Line: 85) Drupal\page_cache\StackMiddleware\PageCache-&gt;handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware-&gt;handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware-&gt;handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\StackedHttpKernel-&gt;handle(Object, 1, 1) (Line: 704) Drupal\Core\DrupalKernel-&gt;handle(Object) (Line: 19) </code></pre> <p>一度以为是模块问题,经排查,发现是数据库恢复时,用户数据表(users)中的匿名用户ID恢复错误!</p> <p>匿名用户的用户ID(即uid)在Drupal中应该为0,但由于uid字段是自增的,且是主键,在用Navicat数据库工具恢复时,匿名用户的uid变成了自增的最大值,导致日志查询时,如果日志是匿名用户产生的,那么会由于找不到匿名用户账户,导致用户实体变量成为NULL,从而导致上面的错误</p> <p>该种错误很罕见,排查时很难注意到是这个点,所有数据库工具在恢复时都应小心</p> <p>&nbsp;</p> <p>&nbsp;</p> </div> <section data-drupal-selector="comments" class="comments"> <h2 class="comments__title">交流互动</h2> <div class="add-comment"> <div class="add-comment__form"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=404&amp;2=comment&amp;3=comment" token="cxSHj8kcdTZBobBxlE2qWoNvQSX4LN6a4-0d1X2phmY"></drupal-render-placeholder> </div> </div> </section> Fri, 11 Aug 2023 07:40:13 +0000 yunke 404 at http://indrupal.com http://indrupal.com/index.php/node/404#comments Drupal安全相关设置处理 http://indrupal.com/index.php/node/400 <span>Drupal安全相关设置处理</span> <span><span>yunke</span></span> <span><time datetime="2023-07-28T08:55:33+08:00" title="2023-07-28 08:55 星期五">周五, 07/28/2023 - 08:55</time> </span> <div class="text-content clearfix field field--name-body field--type-text-with-summary field--label-hidden field__item"><p><strong>1、去除Drupal特征</strong></p> <p><span style="background-color:#999999;">可选去除首部产生器标签:</span><br /> &lt;meta name="Generator" content="Drupal 8 (https://www.drupal.org)" /&gt;<br /> 是在core/modules/system/system.module:system_page_attachments函数中设置,因此对应去除</p> <p><span style="background-color:#999999;">可选去除http响应头:</span><br /> 服务名:response_generator_subscriber<br /> 执行方法:onRespond<br /> 优先级:0-2<br /> 只作用于主请求,在响应头中设置系统标志标签,值为:<br /> X-Generator:'Drupal&nbsp; $version&nbsp; (https://www.drupal.org)'<br /> 通过该响应头可以看出网站使用了drupal系统,是一种宣传手段,没有什么实际用途,该服务定义在此文件中:core/core.services.yml,如果不需要可以进行服务覆写,也可以在事件派发器中移除该订阅器</p> <p><span style="background-color:#999999;">可选去除特殊文件:</span><br /> http://www.dp9.com/core/CHANGELOG.txt</p> <p><strong>2、上传文件名处理:</strong></p> <p>配置项:</p> <pre> <code class="language-php">\Drupal::config('system.file')-&gt;get('allow_insecure_uploads')</code></pre> <p>默认为false,应该保持默认值,如果为true,则上传的文件名不会被处理,有可能出现安全问题,有些服务器(比如Apache)在处理文件链接时,遇到不能识别的扩展名,会回退使用前面的扩展名,比如请求文件yunke.php.pps时,不能识别pps,那么将扩展名视为php,因此文件会被当做php文件执行,这导致了安全漏洞,因此文件上传后需要对文件名进行特殊检查处理,drupal使用以下函数来干这件事:</p> <pre> <code class="language-php"> file_munge_filename($filename, $extensions, $alerts = TRUE)</code></pre> <p>以上配置项影响该函数行为</p> <p>&nbsp;</p> <p>&nbsp;</p> </div> <section data-drupal-selector="comments" class="comments"> <h2 class="comments__title">交流互动</h2> <div class="add-comment"> <div class="add-comment__form"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=400&amp;2=comment&amp;3=comment" token="PiPY35TPQzSmkp0Odonsn3FVvgey2c3paVl9HkMXfEg"></drupal-render-placeholder> </div> </div> </section> Fri, 28 Jul 2023 00:55:33 +0000 yunke 400 at http://indrupal.com http://indrupal.com/index.php/node/400#comments Drupal是CMS还是CMF? http://indrupal.com/index.php/node/378 <span>Drupal是CMS还是CMF?</span> <span><span>yunke</span></span> <span><time datetime="2023-04-18T15:39:09+08:00" title="2023-04-18 15:39 星期二">周二, 04/18/2023 - 15:39</time> </span> <div class="text-content clearfix field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>有的人把Drupal看做是一个CMS(内容管理系统),而有的则把它看做是CMF(内容管理框架),不管是CMS还是CMF,其实都对,只是个名字而已,不必太在意,从Drupal整体软件架构这个角度看,是分层设计的,上层系统建立在下层系统之上,依赖着下层系统:<br /> 类自动加载等基础设施算一层:这层都是web项目通用的<br /> HTTP核心和容器可以算一层:单看这一层可以将Drupal视为开发框架<br /> 实体概念的实现算一层:在这一层上可以将Drupal视为内容管理框架,也就是CMF<br /> 再往上的表单系统、主题、权限控制等算一层:这一层非常接近应用,内容众多,站在这一层上可以将Drupal视为CMS</p> <p>总结一下,Drupal系统架构可以分为如下四层:<br /> 基础层(基础的WEB组件,比如请求、响应对象、类加载器等,这层是web项目通用的,提供基础工具)<br /> 框架层(主要内容是HTTP核心和容器,你可以将Drupal当框架用)<br /> 数据层(数据库抽象层,实体)<br /> 应用层(权限控制、块系统、显示模式、视图等等)</p> <p>角度不一样强调的东西不一样,说是CMS可能更多的是看到Drupal提供了直接使用的功能,说是CMF更多是看到了这种架构带来的灵活强大,完全取决于你想强调什么,Drupal确实非常强大灵活,设计优雅。</p> <p>&nbsp;</p> </div> <section data-drupal-selector="comments" class="comments"> <h2 class="comments__title">交流互动</h2> <div class="add-comment"> <div class="add-comment__form"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=378&amp;2=comment&amp;3=comment" token="5829n6wfpe7RAcRcwjQYM0cDU6aEZ6g8P_WtSe8wtZc"></drupal-render-placeholder> </div> </div> </section> Tue, 18 Apr 2023 07:39:09 +0000 yunke 378 at http://indrupal.com http://indrupal.com/index.php/node/378#comments phpstudy自定义PHP版本的方法,为安装Drupal 10 http://indrupal.com/index.php/node/375 <span>phpstudy自定义PHP版本的方法,为安装Drupal 10</span> <span><span>yunke</span></span> <span><time datetime="2023-04-06T11:27:57+08:00" title="2023-04-06 11:27 星期四">周四, 04/06/2023 - 11:27</time> </span> <div class="text-content clearfix field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Drupal 10 第一个正式版本已于2022年12月15日正式发布,其最低PHP版本要求为PHP 8.1,推荐为8.1.6以上,这困扰了一些在windows下使用集成安装环境的朋友,比如:phpstudy的php安装列表里面最高只支持到PHP 8.0.2,PHPCUSTOM直接没有PHP 8 的支持,这就需要我们自定义安装了,本文以安装Drupal 10为例,教你在phpstudy中自定义安装PHP的任意版本。</p><p>首先到PHP官网下载我们需要的PHP版本:<br>打开PHP官网,点击页面顶部的“Downloads”按钮,打开下载页面,找到所需的版本,然后点击“Windows downloads ”打开下载页面<br>这里我们以下载8.2.4为例,将打开<br>https://windows.php.net/download#php-8.2<br>然后依据自己操作系统的位数以及是否线程安全进行选择,32位操作系统就选择X86<br>这里我们选择64位非线程安全的版本,即“VS16 x64 Non Thread Safe”<br>然后点击其中的“Zip”子链接,即开始下载</p><p>然后找到phpstudy的PHP目录|:“\phpstudy_pro\Extensions\php\”<br>在其为我们刚刚下载的PHP版本创建一个目录,比如“php8.2.4nts”<br>然后将刚下载的PHP解压到该目录,此时“php.exe”的完整路径应该是:<br>phpstudy_pro\Extensions\php\php8.2.4nts\php.exe<br>双击它如果不能成功运行,那么你还需要安装微软的VC运行库,运行库下载地址:<br><a href="https://visualstudio.microsoft.com/zh-hans/downloads/">https://visualstudio.microsoft.com/zh-hans/downloads/</a><br>找到“其他工具、框架和可再发行组件”然后下载里面的:<br>Microsoft Visual C++ Redistributable for Visual Studio 2022</p><p>经过以上操作,在phpstudy中已经可以为网站配置安装的PHP版本了<br>注意:此时在phpstudy自身的php安装列表中,依然看不到我们新安装的PHP版本,但没关系,他不影响使用,只需在网站配置页里面选择新安装的PHP版本即可</p><p>如果在配置中,选择php 8以上版本时,网站出现了500错误状态码,那么大概率是VC库没有安装好,按前述方法下载安装即可</p><p>还是希望这些集成环境能够快一点更新,免去使用者自己去安装的麻烦</p><p>现在我们来安装Drupal 10 ,为其配置好网站后,启动安装过程会提示有很多需要的PHP扩展没有被启用,那么我们来启用相关扩展</p><p>打开配置文件“phpstudy_pro\Extensions\php\php8.2.4nts\php.ini”,我们会发现里面是空的,其实php官方已经为我们提前准备好了两个预配置文件(在相同目录下):<br>php.ini-development:开发环境下使用<br>php.ini-production:生成环境(正式上线服务的环境)</p><p>根据需要复制其中一个配置的内容到上述php.ini文件,再根据自己的配置需要进行细节修改,保存即可<br>这里提供一个完整的配置内容供新人朋友体验Drupal 10,配置如下:</p><pre><code class="language-plaintext language-ini">[PHP] ;;;;;;;;;;;;;;;;;;; ; About php.ini ; ;;;;;;;;;;;;;;;;;;; ; PHP's initialization file, generally called php.ini, is responsible for ; configuring many of the aspects of PHP's behavior. ; PHP attempts to find and load this configuration from a number of locations. ; The following is a summary of its search order: ; 1. SAPI module specific location. ; 2. The PHPRC environment variable. ; 3. A number of predefined registry keys on Windows ; 4. Current working directory (except CLI) ; 5. The web server's directory (for SAPI modules), or directory of PHP ; (otherwise in Windows) ; 6. The directory from the --with-config-file-path compile time option, or the ; Windows directory (usually C:\windows) ; See the PHP docs for more specific information. ; https://php.net/configuration.file ; The syntax of the file is extremely simple. Whitespace and lines ; beginning with a semicolon are silently ignored (as you probably guessed). ; Section headers (e.g. [Foo]) are also silently ignored, even though ; they might mean something in the future. ; Directives following the section heading [PATH=/www/mysite] only ; apply to PHP files in the /www/mysite directory. Directives ; following the section heading [HOST=www.example.com] only apply to ; PHP files served from www.example.com. Directives set in these ; special sections cannot be overridden by user-defined INI files or ; at runtime. Currently, [PATH=] and [HOST=] sections only work under ; CGI/FastCGI. ; https://php.net/ini.sections ; Directives are specified using the following syntax: ; directive = value ; Directive names are *case sensitive* - foo=bar is different from FOO=bar. ; Directives are variables used to configure PHP or PHP extensions. ; There is no name validation. If PHP can't find an expected ; directive because it is not set or is mistyped, a default value will be used. ; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one ; of the INI constants (On, Off, True, False, Yes, No and None) or an expression ; (e.g. E_ALL &amp; ~E_NOTICE), a quoted string ("bar"), or a reference to a ; previously set variable or directive (e.g. ${foo}) ; Expressions in the INI file are limited to bitwise operators and parentheses: ; | bitwise OR ; ^ bitwise XOR ; &amp; bitwise AND ; ~ bitwise NOT ; ! boolean NOT ; Boolean flags can be turned on using the values 1, On, True or Yes. ; They can be turned off using the values 0, Off, False or No. ; An empty string can be denoted by simply not writing anything after the equal ; sign, or by using the None keyword: ; foo = ; sets foo to an empty string ; foo = None ; sets foo to an empty string ; foo = "None" ; sets foo to the string 'None' ; If you use constants in your value, and these constants belong to a ; dynamically loaded extension (either a PHP extension or a Zend extension), ; you may only use these constants *after* the line that loads the extension. ;;;;;;;;;;;;;;;;;;; ; About this file ; ;;;;;;;;;;;;;;;;;;; ; PHP comes packaged with two INI files. One that is recommended to be used ; in production environments and one that is recommended to be used in ; development environments. ; php.ini-production contains settings which hold security, performance and ; best practices at its core. But please be aware, these settings may break ; compatibility with older or less security conscience applications. We ; recommending using the production ini in production and testing environments. ; php.ini-development is very similar to its production variant, except it is ; much more verbose when it comes to errors. We recommend using the ; development version only in development environments, as errors shown to ; application users can inadvertently leak otherwise secure information. ; This is the php.ini-development INI file. ;;;;;;;;;;;;;;;;;;; ; Quick Reference ; ;;;;;;;;;;;;;;;;;;; ; The following are all the settings which are different in either the production ; or development versions of the INIs with respect to PHP's default behavior. ; Please see the actual settings later in the document for more details as to why ; we recommend these changes in PHP's behavior. ; display_errors ; Default Value: On ; Development Value: On ; Production Value: Off ; display_startup_errors ; Default Value: On ; Development Value: On ; Production Value: Off ; error_reporting ; Default Value: E_ALL ; Development Value: E_ALL ; Production Value: E_ALL &amp; ~E_DEPRECATED &amp; ~E_STRICT ; log_errors ; Default Value: Off ; Development Value: On ; Production Value: On ; max_input_time ; Default Value: -1 (Unlimited) ; Development Value: 60 (60 seconds) ; Production Value: 60 (60 seconds) ; output_buffering ; Default Value: Off ; Development Value: 4096 ; Production Value: 4096 ; register_argc_argv ; Default Value: On ; Development Value: Off ; Production Value: Off ; request_order ; Default Value: None ; Development Value: "GP" ; Production Value: "GP" ; session.gc_divisor ; Default Value: 100 ; Development Value: 1000 ; Production Value: 1000 ; session.sid_bits_per_character ; Default Value: 4 ; Development Value: 5 ; Production Value: 5 ; short_open_tag ; Default Value: On ; Development Value: Off ; Production Value: Off ; variables_order ; Default Value: "EGPCS" ; Development Value: "GPCS" ; Production Value: "GPCS" ; zend.exception_ignore_args ; Default Value: Off ; Development Value: Off ; Production Value: On ; zend.exception_string_param_max_len ; Default Value: 15 ; Development Value: 15 ; Production Value: 0 ;;;;;;;;;;;;;;;;;;;; ; php.ini Options ; ;;;;;;;;;;;;;;;;;;;; ; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini" ;user_ini.filename = ".user.ini" ; To disable this feature set this option to an empty value ;user_ini.filename = ; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes) ;user_ini.cache_ttl = 300 ;;;;;;;;;;;;;;;;;;;; ; Language Options ; ;;;;;;;;;;;;;;;;;;;; ; Enable the PHP scripting language engine under Apache. ; https://php.net/engine engine = On ; This directive determines whether or not PHP will recognize code between ; &lt;? and ?&gt; tags as PHP source which should be processed as such. It is ; generally recommended that &lt;?php and ?&gt; should be used and that this feature ; should be disabled, as enabling it may result in issues when generating XML ; documents, however this remains supported for backward compatibility reasons. ; Note that this directive does not control the &lt;?= shorthand tag, which can be ; used regardless of this directive. ; Default Value: On ; Development Value: Off ; Production Value: Off ; https://php.net/short-open-tag short_open_tag = Off ; The number of significant digits displayed in floating point numbers. ; https://php.net/precision precision = 14 ; Output buffering is a mechanism for controlling how much output data ; (excluding headers and cookies) PHP should keep internally before pushing that ; data to the client. If your application's output exceeds this setting, PHP ; will send that data in chunks of roughly the size you specify. ; Turning on this setting and managing its maximum buffer size can yield some ; interesting side-effects depending on your application and web server. ; You may be able to send headers and cookies after you've already sent output ; through print or echo. You also may see performance benefits if your server is ; emitting less packets due to buffered output versus PHP streaming the output ; as it gets it. On production servers, 4096 bytes is a good setting for performance ; reasons. ; Note: Output buffering can also be controlled via Output Buffering Control ; functions. ; Possible Values: ; On = Enabled and buffer is unlimited. (Use with caution) ; Off = Disabled ; Integer = Enables the buffer and sets its maximum size in bytes. ; Note: This directive is hardcoded to Off for the CLI SAPI ; Default Value: Off ; Development Value: 4096 ; Production Value: 4096 ; https://php.net/output-buffering output_buffering = 4096 ; You can redirect all of the output of your scripts to a function. For ; example, if you set output_handler to "mb_output_handler", character ; encoding will be transparently converted to the specified encoding. ; Setting any output handler automatically turns on output buffering. ; Note: People who wrote portable scripts should not depend on this ini ; directive. Instead, explicitly set the output handler using ob_start(). ; Using this ini directive may cause problems unless you know what script ; is doing. ; Note: You cannot use both "mb_output_handler" with "ob_iconv_handler" ; and you cannot use both "ob_gzhandler" and "zlib.output_compression". ; Note: output_handler must be empty if this is set 'On' !!!! ; Instead you must use zlib.output_handler. ; https://php.net/output-handler ;output_handler = ; URL rewriter function rewrites URL on the fly by using ; output buffer. You can set target tags by this configuration. ; "form" tag is special tag. It will add hidden input tag to pass values. ; Refer to session.trans_sid_tags for usage. ; Default Value: "form=" ; Development Value: "form=" ; Production Value: "form=" ;url_rewriter.tags ; URL rewriter will not rewrite absolute URL nor form by default. To enable ; absolute URL rewrite, allowed hosts must be defined at RUNTIME. ; Refer to session.trans_sid_hosts for more details. ; Default Value: "" ; Development Value: "" ; Production Value: "" ;url_rewriter.hosts ; Transparent output compression using the zlib library ; Valid values for this option are 'off', 'on', or a specific buffer size ; to be used for compression (default is 4KB) ; Note: Resulting chunk size may vary due to nature of compression. PHP ; outputs chunks that are few hundreds bytes each as a result of ; compression. If you prefer a larger chunk size for better ; performance, enable output_buffering in addition. ; Note: You need to use zlib.output_handler instead of the standard ; output_handler, or otherwise the output will be corrupted. ; https://php.net/zlib.output-compression zlib.output_compression = Off ; https://php.net/zlib.output-compression-level ;zlib.output_compression_level = -1 ; You cannot specify additional output handlers if zlib.output_compression ; is activated here. This setting does the same as output_handler but in ; a different order. ; https://php.net/zlib.output-handler ;zlib.output_handler = ; Implicit flush tells PHP to tell the output layer to flush itself ; automatically after every output block. This is equivalent to calling the ; PHP function flush() after each and every call to print() or echo() and each ; and every HTML block. Turning this option on has serious performance ; implications and is generally recommended for debugging purposes only. ; https://php.net/implicit-flush ; Note: This directive is hardcoded to On for the CLI SAPI implicit_flush = Off ; The unserialize callback function will be called (with the undefined class' ; name as parameter), if the unserializer finds an undefined class ; which should be instantiated. A warning appears if the specified function is ; not defined, or if the function doesn't include/implement the missing class. ; So only set this entry, if you really want to implement such a ; callback-function. unserialize_callback_func = ; The unserialize_max_depth specifies the default depth limit for unserialized ; structures. Setting the depth limit too high may result in stack overflows ; during unserialization. The unserialize_max_depth ini setting can be ; overridden by the max_depth option on individual unserialize() calls. ; A value of 0 disables the depth limit. ;unserialize_max_depth = 4096 ; When floats &amp; doubles are serialized, store serialize_precision significant ; digits after the floating point. The default value ensures that when floats ; are decoded with unserialize, the data will remain the same. ; The value is also used for json_encode when encoding double values. ; If -1 is used, then dtoa mode 0 is used which automatically select the best ; precision. serialize_precision = -1 ; open_basedir, if set, limits all file operations to the defined directory ; and below. This directive makes most sense if used in a per-directory ; or per-virtualhost web server configuration file. ; Note: disables the realpath cache ; https://php.net/open-basedir ;open_basedir = ; This directive allows you to disable certain functions. ; It receives a comma-delimited list of function names. ; https://php.net/disable-functions disable_functions = ; This directive allows you to disable certain classes. ; It receives a comma-delimited list of class names. ; https://php.net/disable-classes disable_classes = ; Colors for Syntax Highlighting mode. Anything that's acceptable in ; &lt;span style="color: ???????"&gt; would work. ; https://php.net/syntax-highlighting ;highlight.string = #DD0000 ;highlight.comment = #FF9900 ;highlight.keyword = #007700 ;highlight.default = #0000BB ;highlight.html = #000000 ; If enabled, the request will be allowed to complete even if the user aborts ; the request. Consider enabling it if executing long requests, which may end up ; being interrupted by the user or a browser timing out. PHP's default behavior ; is to disable this feature. ; https://php.net/ignore-user-abort ;ignore_user_abort = On ; Determines the size of the realpath cache to be used by PHP. This value should ; be increased on systems where PHP opens many files to reflect the quantity of ; the file operations performed. ; Note: if open_basedir is set, the cache is disabled ; https://php.net/realpath-cache-size ;realpath_cache_size = 4096k ; Duration of time, in seconds for which to cache realpath information for a given ; file or directory. For systems with rarely changing files, consider increasing this ; value. ; https://php.net/realpath-cache-ttl ;realpath_cache_ttl = 120 ; Enables or disables the circular reference collector. ; https://php.net/zend.enable-gc zend.enable_gc = On ; If enabled, scripts may be written in encodings that are incompatible with ; the scanner. CP936, Big5, CP949 and Shift_JIS are the examples of such ; encodings. To use this feature, mbstring extension must be enabled. ;zend.multibyte = Off ; Allows to set the default encoding for the scripts. This value will be used ; unless "declare(encoding=...)" directive appears at the top of the script. ; Only affects if zend.multibyte is set. ;zend.script_encoding = ; Allows to include or exclude arguments from stack traces generated for exceptions. ; In production, it is recommended to turn this setting on to prohibit the output ; of sensitive information in stack traces ; Default Value: Off ; Development Value: Off ; Production Value: On zend.exception_ignore_args = Off ; Allows setting the maximum string length in an argument of a stringified stack trace ; to a value between 0 and 1000000. ; This has no effect when zend.exception_ignore_args is enabled. ; Default Value: 15 ; Development Value: 15 ; Production Value: 0 zend.exception_string_param_max_len = 15 ;;;;;;;;;;;;;;;;; ; Miscellaneous ; ;;;;;;;;;;;;;;;;; ; Decides whether PHP may expose the fact that it is installed on the server ; (e.g. by adding its signature to the Web server header). It is no security ; threat in any way, but it makes it possible to determine whether you use PHP ; on your server or not. ; https://php.net/expose-php expose_php = Off ;;;;;;;;;;;;;;;;;;; ; Resource Limits ; ;;;;;;;;;;;;;;;;;;; ; Maximum execution time of each script, in seconds ; https://php.net/max-execution-time ; Note: This directive is hardcoded to 0 for the CLI SAPI max_execution_time = 300 ; Maximum amount of time each script may spend parsing request data. It's a good ; idea to limit this time on productions servers in order to eliminate unexpectedly ; long running scripts. ; Note: This directive is hardcoded to -1 for the CLI SAPI ; Default Value: -1 (Unlimited) ; Development Value: 60 (60 seconds) ; Production Value: 60 (60 seconds) ; https://php.net/max-input-time max_input_time = 60 ; Maximum input variable nesting level ; https://php.net/max-input-nesting-level ;max_input_nesting_level = 64 ; How many GET/POST/COOKIE input variables may be accepted ;max_input_vars = 1000 ; How many multipart body parts (combined input variable and file uploads) may ; be accepted. ; Default Value: -1 (Sum of max_input_vars and max_file_uploads) ;max_multipart_body_parts = 1500 ; Maximum amount of memory a script may consume ; https://php.net/memory-limit memory_limit = 2048M ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Error handling and logging ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; This directive informs PHP of which errors, warnings and notices you would like ; it to take action for. The recommended way of setting values for this ; directive is through the use of the error level constants and bitwise ; operators. The error level constants are below here for convenience as well as ; some common settings and their meanings. ; By default, PHP is set to take action on all errors, notices and warnings EXCEPT ; those related to E_NOTICE and E_STRICT, which together cover best practices and ; recommended coding standards in PHP. For performance reasons, this is the ; recommend error reporting setting. Your production server shouldn't be wasting ; resources complaining about best practices and coding standards. That's what ; development servers and development settings are for. ; Note: The php.ini-development file has this setting as E_ALL. This ; means it pretty much reports everything which is exactly what you want during ; development and early testing. ; ; Error Level Constants: ; E_ALL - All errors and warnings ; E_ERROR - fatal run-time errors ; E_RECOVERABLE_ERROR - almost fatal run-time errors ; E_WARNING - run-time warnings (non-fatal errors) ; E_PARSE - compile-time parse errors ; E_NOTICE - run-time notices (these are warnings which often result ; from a bug in your code, but it's possible that it was ; intentional (e.g., using an uninitialized variable and ; relying on the fact it is automatically initialized to an ; empty string) ; E_STRICT - run-time notices, enable to have PHP suggest changes ; to your code which will ensure the best interoperability ; and forward compatibility of your code ; E_CORE_ERROR - fatal errors that occur during PHP's initial startup ; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's ; initial startup ; E_COMPILE_ERROR - fatal compile-time errors ; E_COMPILE_WARNING - compile-time warnings (non-fatal errors) ; E_USER_ERROR - user-generated error message ; E_USER_WARNING - user-generated warning message ; E_USER_NOTICE - user-generated notice message ; E_DEPRECATED - warn about code that will not work in future versions ; of PHP ; E_USER_DEPRECATED - user-generated deprecation warnings ; ; Common Values: ; E_ALL (Show all errors, warnings and notices including coding standards.) ; E_ALL &amp; ~E_NOTICE (Show all errors, except for notices) ; E_ALL &amp; ~E_NOTICE &amp; ~E_STRICT (Show all errors, except for notices and coding standards warnings.) ; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors) ; Default Value: E_ALL ; Development Value: E_ALL ; Production Value: E_ALL &amp; ~E_DEPRECATED &amp; ~E_STRICT ; https://php.net/error-reporting error_reporting = E_ALL ; This directive controls whether or not and where PHP will output errors, ; notices and warnings too. Error output is very useful during development, but ; it could be very dangerous in production environments. Depending on the code ; which is triggering the error, sensitive information could potentially leak ; out of your application such as database usernames and passwords or worse. ; For production environments, we recommend logging errors rather than ; sending them to STDOUT. ; Possible Values: ; Off = Do not display any errors ; stderr = Display errors to STDERR (affects only CGI/CLI binaries!) ; On or stdout = Display errors to STDOUT ; Default Value: On ; Development Value: On ; Production Value: Off ; https://php.net/display-errors display_errors = On ; The display of errors which occur during PHP's startup sequence are handled ; separately from display_errors. We strongly recommend you set this to 'off' ; for production servers to avoid leaking configuration details. ; Default Value: On ; Development Value: On ; Production Value: Off ; https://php.net/display-startup-errors display_startup_errors = On ; Besides displaying errors, PHP can also log errors to locations such as a ; server-specific log, STDERR, or a location specified by the error_log ; directive found below. While errors should not be displayed on productions ; servers they should still be monitored and logging is a great way to do that. ; Default Value: Off ; Development Value: On ; Production Value: On ; https://php.net/log-errors log_errors = On ; Do not log repeated messages. Repeated errors must occur in same file on same ; line unless ignore_repeated_source is set true. ; https://php.net/ignore-repeated-errors ignore_repeated_errors = Off ; Ignore source of message when ignoring repeated messages. When this setting ; is On you will not log errors with repeated messages from different files or ; source lines. ; https://php.net/ignore-repeated-source ignore_repeated_source = Off ; If this parameter is set to Off, then memory leaks will not be shown (on ; stdout or in the log). This is only effective in a debug compile, and if ; error reporting includes E_WARNING in the allowed list ; https://php.net/report-memleaks report_memleaks = On ; This setting is off by default. ;report_zend_debug = 0 ; Turn off normal error reporting and emit XML-RPC error XML ; https://php.net/xmlrpc-errors ;xmlrpc_errors = 0 ; An XML-RPC faultCode ;xmlrpc_error_number = 0 ; When PHP displays or logs an error, it has the capability of formatting the ; error message as HTML for easier reading. This directive controls whether ; the error message is formatted as HTML or not. ; Note: This directive is hardcoded to Off for the CLI SAPI ; https://php.net/html-errors ;html_errors = On ; If html_errors is set to On *and* docref_root is not empty, then PHP ; produces clickable error messages that direct to a page describing the error ; or function causing the error in detail. ; You can download a copy of the PHP manual from https://php.net/docs ; and change docref_root to the base URL of your local copy including the ; leading '/'. You must also specify the file extension being used including ; the dot. PHP's default behavior is to leave these settings empty, in which ; case no links to documentation are generated. ; Note: Never use this feature for production boxes. ; https://php.net/docref-root ; Examples ;docref_root = "/phpmanual/" ; https://php.net/docref-ext ;docref_ext = .html ; String to output before an error message. PHP's default behavior is to leave ; this setting blank. ; https://php.net/error-prepend-string ; Example: ;error_prepend_string = "&lt;span style='color: #ff0000'&gt;" ; String to output after an error message. PHP's default behavior is to leave ; this setting blank. ; https://php.net/error-append-string ; Example: ;error_append_string = "&lt;/span&gt;" ; Log errors to specified file. PHP's default behavior is to leave this value ; empty. ; https://php.net/error-log ; Example: ;error_log = php_errors.log ; Log errors to syslog (Event Log on Windows). ;error_log = syslog ; The syslog ident is a string which is prepended to every message logged ; to syslog. Only used when error_log is set to syslog. ;syslog.ident = php ; The syslog facility is used to specify what type of program is logging ; the message. Only used when error_log is set to syslog. ;syslog.facility = user ; Set this to disable filtering control characters (the default). ; Some loggers only accept NVT-ASCII, others accept anything that's not ; control characters. If your logger accepts everything, then no filtering ; is needed at all. ; Allowed values are: ; ascii (all printable ASCII characters and NL) ; no-ctrl (all characters except control characters) ; all (all characters) ; raw (like "all", but messages are not split at newlines) ; https://php.net/syslog.filter ;syslog.filter = ascii ;windows.show_crt_warning ; Default value: 0 ; Development value: 0 ; Production value: 0 ;;;;;;;;;;;;;;;;; ; Data Handling ; ;;;;;;;;;;;;;;;;; ; The separator used in PHP generated URLs to separate arguments. ; PHP's default setting is "&amp;". ; https://php.net/arg-separator.output ; Example: ;arg_separator.output = "&amp;amp;" ; List of separator(s) used by PHP to parse input URLs into variables. ; PHP's default setting is "&amp;". ; NOTE: Every character in this directive is considered as separator! ; https://php.net/arg-separator.input ; Example: ;arg_separator.input = ";&amp;" ; This directive determines which super global arrays are registered when PHP ; starts up. G,P,C,E &amp; S are abbreviations for the following respective super ; globals: GET, POST, COOKIE, ENV and SERVER. There is a performance penalty ; paid for the registration of these arrays and because ENV is not as commonly ; used as the others, ENV is not recommended on productions servers. You ; can still get access to the environment variables through getenv() should you ; need to. ; Default Value: "EGPCS" ; Development Value: "GPCS" ; Production Value: "GPCS"; ; https://php.net/variables-order variables_order = "GPCS" ; This directive determines which super global data (G,P &amp; C) should be ; registered into the super global array REQUEST. If so, it also determines ; the order in which that data is registered. The values for this directive ; are specified in the same manner as the variables_order directive, ; EXCEPT one. Leaving this value empty will cause PHP to use the value set ; in the variables_order directive. It does not mean it will leave the super ; globals array REQUEST empty. ; Default Value: None ; Development Value: "GP" ; Production Value: "GP" ; https://php.net/request-order request_order = "GP" ; This directive determines whether PHP registers $argv &amp; $argc each time it ; runs. $argv contains an array of all the arguments passed to PHP when a script ; is invoked. $argc contains an integer representing the number of arguments ; that were passed when the script was invoked. These arrays are extremely ; useful when running scripts from the command line. When this directive is ; enabled, registering these variables consumes CPU cycles and memory each time ; a script is executed. For performance reasons, this feature should be disabled ; on production servers. ; Note: This directive is hardcoded to On for the CLI SAPI ; Default Value: On ; Development Value: Off ; Production Value: Off ; https://php.net/register-argc-argv register_argc_argv = Off ; When enabled, the ENV, REQUEST and SERVER variables are created when they're ; first used (Just In Time) instead of when the script starts. If these ; variables are not used within a script, having this directive on will result ; in a performance gain. The PHP directive register_argc_argv must be disabled ; for this directive to have any effect. ; https://php.net/auto-globals-jit auto_globals_jit = On ; Whether PHP will read the POST data. ; This option is enabled by default. ; Most likely, you won't want to disable this option globally. It causes $_POST ; and $_FILES to always be empty; the only way you will be able to read the ; POST data will be through the php://input stream wrapper. This can be useful ; to proxy requests or to process the POST data in a memory efficient fashion. ; https://php.net/enable-post-data-reading ;enable_post_data_reading = Off ; Maximum size of POST data that PHP will accept. ; Its value may be 0 to disable the limit. It is ignored if POST data reading ; is disabled through enable_post_data_reading. ; https://php.net/post-max-size post_max_size = 100M ; Automatically add files before PHP document. ; https://php.net/auto-prepend-file auto_prepend_file = ; Automatically add files after PHP document. ; https://php.net/auto-append-file auto_append_file = ; By default, PHP will output a media type using the Content-Type header. To ; disable this, simply set it to be empty. ; ; PHP's built-in default media type is set to text/html. ; https://php.net/default-mimetype default_mimetype = "text/html" ; PHP's default character set is set to UTF-8. ; https://php.net/default-charset default_charset = "UTF-8" ; PHP internal character encoding is set to empty. ; If empty, default_charset is used. ; https://php.net/internal-encoding ;internal_encoding = ; PHP input character encoding is set to empty. ; If empty, default_charset is used. ; https://php.net/input-encoding ;input_encoding = ; PHP output character encoding is set to empty. ; If empty, default_charset is used. ; See also output_buffer. ; https://php.net/output-encoding ;output_encoding = ;;;;;;;;;;;;;;;;;;;;;;;;; ; Paths and Directories ; ;;;;;;;;;;;;;;;;;;;;;;;;; ; UNIX: "/path1:/path2" ;include_path = ".:/php/includes" ; ; Windows: "\path1;\path2" ;include_path = ".;c:\php\includes" ; ; PHP's default setting for include_path is ".;/path/to/php/pear" ; https://php.net/include-path ; The root of the PHP pages, used only if nonempty. ; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root ; if you are running php as a CGI under any web server (other than IIS) ; see documentation for security issues. The alternate is to use the ; cgi.force_redirect configuration below ; https://php.net/doc-root doc_root = ; The directory under which PHP opens the script using /~username used only ; if nonempty. ; https://php.net/user-dir user_dir = ; Directory in which the loadable extensions (modules) reside. ; https://php.net/extension-dir ;extension_dir = "./" ; On windows:通常需要明确指出扩展目录,该地址错误会导致无法加载扩展,从而配置无效 extension_dir = "ext" ; Directory where the temporary files should be placed. ; Defaults to the system default (see sys_get_temp_dir) ;sys_temp_dir = "/tmp" ; Whether or not to enable the dl() function. The dl() function does NOT work ; properly in multithreaded servers, such as IIS or Zeus, and is automatically ; disabled on them. ; https://php.net/enable-dl enable_dl = Off ; cgi.force_redirect is necessary to provide security running PHP as a CGI under ; most web servers. Left undefined, PHP turns this on by default. You can ; turn it off here AT YOUR OWN RISK ; **You CAN safely turn this off for IIS, in fact, you MUST.** ; https://php.net/cgi.force-redirect ;cgi.force_redirect = 1 ; if cgi.nph is enabled it will force cgi to always sent Status: 200 with ; every request. PHP's default behavior is to disable this feature. ;cgi.nph = 1 ; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape ; (iPlanet) web servers, you MAY need to set an environment variable name that PHP ; will look for to know it is OK to continue execution. Setting this variable MAY ; cause security issues, KNOW WHAT YOU ARE DOING FIRST. ; https://php.net/cgi.redirect-status-env ;cgi.redirect_status_env = ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok ; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. ; https://php.net/cgi.fix-pathinfo ;cgi.fix_pathinfo=1 ; if cgi.discard_path is enabled, the PHP CGI binary can safely be placed outside ; of the web tree and people will not be able to circumvent .htaccess security. ;cgi.discard_path=1 ; FastCGI under IIS supports the ability to impersonate ; security tokens of the calling client. This allows IIS to define the ; security context that the request runs under. mod_fastcgi under Apache ; does not currently support this feature (03/17/2002) ; Set to 1 if running under IIS. Default is zero. ; https://php.net/fastcgi.impersonate ;fastcgi.impersonate = 1 ; Disable logging through FastCGI connection. PHP's default behavior is to enable ; this feature. ;fastcgi.logging = 0 ; cgi.rfc2616_headers configuration option tells PHP what type of headers to ; use when sending HTTP response code. If set to 0, PHP sends Status: header that ; is supported by Apache. When this option is set to 1, PHP will send ; RFC2616 compliant header. ; Default is zero. ; https://php.net/cgi.rfc2616-headers ;cgi.rfc2616_headers = 0 ; cgi.check_shebang_line controls whether CGI PHP checks for line starting with #! ; (shebang) at the top of the running script. This line might be needed if the ; script support running both as stand-alone script and via PHP CGI&lt;. PHP in CGI ; mode skips this line and ignores its content if this directive is turned on. ; https://php.net/cgi.check-shebang-line ;cgi.check_shebang_line=1 ;;;;;;;;;;;;;;;; ; File Uploads ; ;;;;;;;;;;;;;;;; ; Whether to allow HTTP file uploads. ; https://php.net/file-uploads file_uploads = On ; Temporary directory for HTTP uploaded files (will use system default if not ; specified). ; https://php.net/upload-tmp-dir ;upload_tmp_dir = ; Maximum allowed size for uploaded files. ; https://php.net/upload-max-filesize upload_max_filesize = 500M ; Maximum number of files that can be uploaded via a single request max_file_uploads = 20 ;;;;;;;;;;;;;;;;;; ; Fopen wrappers ; ;;;;;;;;;;;;;;;;;; ; Whether to allow the treatment of URLs (like http:// or ftp://) as files. ; https://php.net/allow-url-fopen allow_url_fopen = On ; Whether to allow include/require to open URLs (like https:// or ftp://) as files. ; https://php.net/allow-url-include allow_url_include = Off ; Define the anonymous ftp password (your email address). PHP's default setting ; for this is empty. ; https://php.net/from ;from="john@doe.com" ; Define the User-Agent string. PHP's default setting for this is empty. ; https://php.net/user-agent ;user_agent="PHP" ; Default timeout for socket based streams (seconds) ; https://php.net/default-socket-timeout default_socket_timeout = 60 ; If your scripts have to deal with files from Macintosh systems, ; or you are running on a Mac and need to deal with files from ; unix or win32 systems, setting this flag will cause PHP to ; automatically detect the EOL character in those files so that ; fgets() and file() will work regardless of the source of the file. ; https://php.net/auto-detect-line-endings ;auto_detect_line_endings = Off ;;;;;;;;;;;;;;;;;;;;;; ; Dynamic Extensions ; ;;;;;;;;;;;;;;;;;;;;;; ; If you wish to have an extension loaded automatically, use the following ; syntax: ; ; extension=modulename ; ; For example: ; ; extension=mysqli ; ; When the extension library to load is not located in the default extension ; directory, You may specify an absolute path to the library file: ; ; extension=/path/to/extension/mysqli.so ; ; Note : The syntax used in previous PHP versions ('extension=&lt;ext&gt;.so' and ; 'extension='php_&lt;ext&gt;.dll') is supported for legacy reasons and may be ; deprecated in a future PHP major version. So, when it is possible, please ; move to the new ('extension=&lt;ext&gt;) syntax. ; ; Notes for Windows environments : ; ; - Many DLL files are located in the ext/ ; extension folders as well as the separate PECL DLL download. ; Be sure to appropriately set the extension_dir directive. ; extension=bz2 ; The ldap extension must be before curl if OpenSSL 1.0.2 and OpenLDAP is used ; otherwise it results in segfault when unloading after using SASL. ; See https://github.com/php/php-src/issues/8620 for more info. ;extension=ldap extension=curl ;extension=ffi extension=ftp extension=fileinfo extension=gd extension=gettext extension=gmp extension=intl extension=imap extension=mbstring extension=exif ; Must be after mbstring as it depends on it extension=mysqli ;extension=oci8_12c ; Use with Oracle Database 12c Instant Client ;extension=oci8_19 ; Use with Oracle Database 19 Instant Client extension=odbc extension=openssl ;extension=pdo_firebird extension=pdo_mysql ;extension=pdo_oci extension=pdo_odbc extension=pdo_pgsql extension=pdo_sqlite extension=pgsql ;extension=shmop ; The MIBS data available in the PHP distribution must be installed. ; See https://www.php.net/manual/en/snmp.installation.php ;extension=snmp ;extension=soap extension=sockets ;extension=sodium ;extension=sqlite3 ;extension=tidy ;extension=xsl extension=zip zend_extension=opcache ;;;;;;;;;;;;;;;;;;; ; Module Settings ; ;;;;;;;;;;;;;;;;;;; [CLI Server] ; Whether the CLI web server uses ANSI color coding in its terminal output. cli_server.color = On [Date] ; Defines the default timezone used by the date functions ; https://php.net/date.timezone date.timezone = Asia/Shanghai ; https://php.net/date.default-latitude ;date.default_latitude = 31.7667 ; https://php.net/date.default-longitude ;date.default_longitude = 35.2333 ; https://php.net/date.sunrise-zenith ;date.sunrise_zenith = 90.833333 ; https://php.net/date.sunset-zenith ;date.sunset_zenith = 90.833333 [filter] ; https://php.net/filter.default ;filter.default = unsafe_raw ; https://php.net/filter.default-flags ;filter.default_flags = [iconv] ; Use of this INI entry is deprecated, use global input_encoding instead. ; If empty, default_charset or input_encoding or iconv.input_encoding is used. ; The precedence is: default_charset &lt; input_encoding &lt; iconv.input_encoding ;iconv.input_encoding = ; Use of this INI entry is deprecated, use global internal_encoding instead. ; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. ; The precedence is: default_charset &lt; internal_encoding &lt; iconv.internal_encoding ;iconv.internal_encoding = ; Use of this INI entry is deprecated, use global output_encoding instead. ; If empty, default_charset or output_encoding or iconv.output_encoding is used. ; The precedence is: default_charset &lt; output_encoding &lt; iconv.output_encoding ; To use an output encoding conversion, iconv's output handler must be set ; otherwise output encoding conversion cannot be performed. ;iconv.output_encoding = [imap] ; rsh/ssh logins are disabled by default. Use this INI entry if you want to ; enable them. Note that the IMAP library does not filter mailbox names before ; passing them to rsh/ssh command, thus passing untrusted data to this function ; with rsh/ssh enabled is insecure. ;imap.enable_insecure_rsh=0 [intl] ;intl.default_locale = ; This directive allows you to produce PHP errors when some error ; happens within intl functions. The value is the level of the error produced. ; Default is 0, which does not produce any errors. ;intl.error_level = E_WARNING ;intl.use_exceptions = 0 [sqlite3] ; Directory pointing to SQLite3 extensions ; https://php.net/sqlite3.extension-dir ;sqlite3.extension_dir = ; SQLite defensive mode flag (only available from SQLite 3.26+) ; When the defensive flag is enabled, language features that allow ordinary ; SQL to deliberately corrupt the database file are disabled. This forbids ; writing directly to the schema, shadow tables (eg. FTS data tables), or ; the sqlite_dbpage virtual table. ; https://www.sqlite.org/c3ref/c_dbconfig_defensive.html ; (for older SQLite versions, this flag has no use) ;sqlite3.defensive = 1 [Pcre] ; PCRE library backtracking limit. ; https://php.net/pcre.backtrack-limit ;pcre.backtrack_limit=100000 ; PCRE library recursion limit. ; Please note that if you set this value to a high number you may consume all ; the available process stack and eventually crash PHP (due to reaching the ; stack size limit imposed by the Operating System). ; https://php.net/pcre.recursion-limit ;pcre.recursion_limit=100000 ; Enables or disables JIT compilation of patterns. This requires the PCRE ; library to be compiled with JIT support. ;pcre.jit=1 [Pdo] ; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off" ; https://php.net/pdo-odbc.connection-pooling ;pdo_odbc.connection_pooling=strict [Pdo_mysql] ; Default socket name for local MySQL connects. If empty, uses the built-in ; MySQL defaults. pdo_mysql.default_socket= [Phar] ; https://php.net/phar.readonly ;phar.readonly = On ; https://php.net/phar.require-hash ;phar.require_hash = On ;phar.cache_list = [mail function] ; For Win32 only. ; https://php.net/smtp SMTP = localhost ; https://php.net/smtp-port smtp_port = 25 ; For Win32 only. ; https://php.net/sendmail-from ;sendmail_from = me@example.com ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). ; https://php.net/sendmail-path ;sendmail_path = ; Force the addition of the specified parameters to be passed as extra parameters ; to the sendmail binary. These parameters will always replace the value of ; the 5th parameter to mail(). ;mail.force_extra_parameters = ; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename mail.add_x_header = Off ; Use mixed LF and CRLF line separators to keep compatibility with some ; RFC 2822 non conformant MTA. mail.mixed_lf_and_crlf = Off ; The path to a log file that will log all mail() calls. Log entries include ; the full path of the script, line number, To address and headers. ;mail.log = ; Log mail to syslog (Event Log on Windows). ;mail.log = syslog [ODBC] ; https://php.net/odbc.default-db ;odbc.default_db = Not yet implemented ; https://php.net/odbc.default-user ;odbc.default_user = Not yet implemented ; https://php.net/odbc.default-pw ;odbc.default_pw = Not yet implemented ; Controls the ODBC cursor model. ; Default: SQL_CURSOR_STATIC (default). ;odbc.default_cursortype ; Allow or prevent persistent links. ; https://php.net/odbc.allow-persistent odbc.allow_persistent = On ; Check that a connection is still valid before reuse. ; https://php.net/odbc.check-persistent odbc.check_persistent = On ; Maximum number of persistent links. -1 means no limit. ; https://php.net/odbc.max-persistent odbc.max_persistent = -1 ; Maximum number of links (persistent + non-persistent). -1 means no limit. ; https://php.net/odbc.max-links odbc.max_links = -1 ; Handling of LONG fields. Returns number of bytes to variables. 0 means ; passthru. ; https://php.net/odbc.defaultlrl odbc.defaultlrl = 4096 ; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char. ; See the documentation on odbc_binmode and odbc_longreadlen for an explanation ; of odbc.defaultlrl and odbc.defaultbinmode ; https://php.net/odbc.defaultbinmode odbc.defaultbinmode = 1 [MySQLi] ; Maximum number of persistent links. -1 means no limit. ; https://php.net/mysqli.max-persistent mysqli.max_persistent = -1 ; Allow accessing, from PHP's perspective, local files with LOAD DATA statements ; https://php.net/mysqli.allow_local_infile ;mysqli.allow_local_infile = On ; It allows the user to specify a folder where files that can be sent via LOAD DATA ; LOCAL can exist. It is ignored if mysqli.allow_local_infile is enabled. ;mysqli.local_infile_directory = ; Allow or prevent persistent links. ; https://php.net/mysqli.allow-persistent mysqli.allow_persistent = On ; Maximum number of links. -1 means no limit. ; https://php.net/mysqli.max-links mysqli.max_links = -1 ; Default port number for mysqli_connect(). If unset, mysqli_connect() will use ; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the ; compile-time value defined MYSQL_PORT (in that order). Win32 will only look ; at MYSQL_PORT. ; https://php.net/mysqli.default-port mysqli.default_port = 3306 ; Default socket name for local MySQL connects. If empty, uses the built-in ; MySQL defaults. ; https://php.net/mysqli.default-socket mysqli.default_socket = ; Default host for mysqli_connect() (doesn't apply in safe mode). ; https://php.net/mysqli.default-host mysqli.default_host = ; Default user for mysqli_connect() (doesn't apply in safe mode). ; https://php.net/mysqli.default-user mysqli.default_user = ; Default password for mysqli_connect() (doesn't apply in safe mode). ; Note that this is generally a *bad* idea to store passwords in this file. ; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw") ; and reveal this password! And of course, any users with read access to this ; file will be able to reveal the password as well. ; https://php.net/mysqli.default-pw mysqli.default_pw = ; Allow or prevent reconnect mysqli.reconnect = Off ; If this option is enabled, closing a persistent connection will rollback ; any pending transactions of this connection, before it is put back ; into the persistent connection pool. ;mysqli.rollback_on_cached_plink = Off [mysqlnd] ; Enable / Disable collection of general statistics by mysqlnd which can be ; used to tune and monitor MySQL operations. mysqlnd.collect_statistics = On ; Enable / Disable collection of memory usage statistics by mysqlnd which can be ; used to tune and monitor MySQL operations. mysqlnd.collect_memory_statistics = On ; Records communication from all extensions using mysqlnd to the specified log ; file. ; https://php.net/mysqlnd.debug ;mysqlnd.debug = ; Defines which queries will be logged. ;mysqlnd.log_mask = 0 ; Default size of the mysqlnd memory pool, which is used by result sets. ;mysqlnd.mempool_default_size = 16000 ; Size of a pre-allocated buffer used when sending commands to MySQL in bytes. ;mysqlnd.net_cmd_buffer_size = 2048 ; Size of a pre-allocated buffer used for reading data sent by the server in ; bytes. ;mysqlnd.net_read_buffer_size = 32768 ; Timeout for network requests in seconds. ;mysqlnd.net_read_timeout = 31536000 ; SHA-256 Authentication Plugin related. File with the MySQL server public RSA ; key. ;mysqlnd.sha256_server_public_key = [OCI8] ; Connection: Enables privileged connections using external ; credentials (OCI_SYSOPER, OCI_SYSDBA) ; https://php.net/oci8.privileged-connect ;oci8.privileged_connect = Off ; Connection: The maximum number of persistent OCI8 connections per ; process. Using -1 means no limit. ; https://php.net/oci8.max-persistent ;oci8.max_persistent = -1 ; Connection: The maximum number of seconds a process is allowed to ; maintain an idle persistent connection. Using -1 means idle ; persistent connections will be maintained forever. ; https://php.net/oci8.persistent-timeout ;oci8.persistent_timeout = -1 ; Connection: The number of seconds that must pass before issuing a ; ping during oci_pconnect() to check the connection validity. When ; set to 0, each oci_pconnect() will cause a ping. Using -1 disables ; pings completely. ; https://php.net/oci8.ping-interval ;oci8.ping_interval = 60 ; Connection: Set this to a user chosen connection class to be used ; for all pooled server requests with Oracle Database Resident ; Connection Pooling (DRCP). To use DRCP, this value should be set to ; the same string for all web servers running the same application, ; the database pool must be configured, and the connection string must ; specify to use a pooled server. ;oci8.connection_class = ; High Availability: Using On lets PHP receive Fast Application ; Notification (FAN) events generated when a database node fails. The ; database must also be configured to post FAN events. ;oci8.events = Off ; Tuning: This option enables statement caching, and specifies how ; many statements to cache. Using 0 disables statement caching. ; https://php.net/oci8.statement-cache-size ;oci8.statement_cache_size = 20 ; Tuning: Enables row prefetching and sets the default number of ; rows that will be fetched automatically after statement execution. ; https://php.net/oci8.default-prefetch ;oci8.default_prefetch = 100 ; Tuning: Sets the amount of LOB data that is internally returned from ; Oracle Database when an Oracle LOB locator is initially retrieved as ; part of a query. Setting this can improve performance by reducing ; round-trips. ; https://php.net/oci8.prefetch-lob-size ; oci8.prefetch_lob_size = 0 ; Compatibility. Using On means oci_close() will not close ; oci_connect() and oci_new_connect() connections. ; https://php.net/oci8.old-oci-close-semantics ;oci8.old_oci_close_semantics = Off [PostgreSQL] ; Allow or prevent persistent links. ; https://php.net/pgsql.allow-persistent pgsql.allow_persistent = On ; Detect broken persistent links always with pg_pconnect(). ; Auto reset feature requires a little overheads. ; https://php.net/pgsql.auto-reset-persistent pgsql.auto_reset_persistent = Off ; Maximum number of persistent links. -1 means no limit. ; https://php.net/pgsql.max-persistent pgsql.max_persistent = -1 ; Maximum number of links (persistent+non persistent). -1 means no limit. ; https://php.net/pgsql.max-links pgsql.max_links = -1 ; Ignore PostgreSQL backends Notice message or not. ; Notice message logging require a little overheads. ; https://php.net/pgsql.ignore-notice pgsql.ignore_notice = 0 ; Log PostgreSQL backends Notice message or not. ; Unless pgsql.ignore_notice=0, module cannot log notice message. ; https://php.net/pgsql.log-notice pgsql.log_notice = 0 [bcmath] ; Number of decimal digits for all bcmath functions. ; https://php.net/bcmath.scale bcmath.scale = 0 [browscap] ; https://php.net/browscap ;browscap = extra/browscap.ini [Session] ; Handler used to store/retrieve data. ; https://php.net/session.save-handler session.save_handler = files ; Argument passed to save_handler. In the case of files, this is the path ; where data files are stored. Note: Windows users have to change this ; variable in order to use PHP's session functions. ; ; The path can be defined as: ; ; session.save_path = "N;/path" ; ; where N is an integer. Instead of storing all the session files in ; /path, what this will do is use subdirectories N-levels deep, and ; store the session data in those directories. This is useful if ; your OS has problems with many files in one directory, and is ; a more efficient layout for servers that handle many sessions. ; ; NOTE 1: PHP will not create this directory structure automatically. ; You can use the script in the ext/session dir for that purpose. ; NOTE 2: See the section on garbage collection below if you choose to ; use subdirectories for session storage ; ; The file storage module creates files using mode 600 by default. ; You can change that by using ; ; session.save_path = "N;MODE;/path" ; ; where MODE is the octal representation of the mode. Note that this ; does not overwrite the process's umask. ; https://php.net/session.save-path ;session.save_path = "/tmp" ; Whether to use strict session mode. ; Strict session mode does not accept an uninitialized session ID, and ; regenerates the session ID if the browser sends an uninitialized session ID. ; Strict mode protects applications from session fixation via a session adoption ; vulnerability. It is disabled by default for maximum compatibility, but ; enabling it is encouraged. ; https://wiki.php.net/rfc/strict_sessions session.use_strict_mode = 0 ; Whether to use cookies. ; https://php.net/session.use-cookies session.use_cookies = 1 ; https://php.net/session.cookie-secure ;session.cookie_secure = ; This option forces PHP to fetch and use a cookie for storing and maintaining ; the session id. We encourage this operation as it's very helpful in combating ; session hijacking when not specifying and managing your own session id. It is ; not the be-all and end-all of session hijacking defense, but it's a good start. ; https://php.net/session.use-only-cookies session.use_only_cookies = 1 ; Name of the session (used as cookie name). ; https://php.net/session.name session.name = PHPSESSID ; Initialize session on request startup. ; https://php.net/session.auto-start session.auto_start = 0 ; Lifetime in seconds of cookie or, if 0, until browser is restarted. ; https://php.net/session.cookie-lifetime session.cookie_lifetime = 0 ; The path for which the cookie is valid. ; https://php.net/session.cookie-path session.cookie_path = / ; The domain for which the cookie is valid. ; https://php.net/session.cookie-domain session.cookie_domain = ; Whether or not to add the httpOnly flag to the cookie, which makes it ; inaccessible to browser scripting languages such as JavaScript. ; https://php.net/session.cookie-httponly session.cookie_httponly = ; Add SameSite attribute to cookie to help mitigate Cross-Site Request Forgery (CSRF/XSRF) ; Current valid values are "Strict", "Lax" or "None". When using "None", ; make sure to include the quotes, as `none` is interpreted like `false` in ini files. ; https://tools.ietf.org/html/draft-west-first-party-cookies-07 session.cookie_samesite = ; Handler used to serialize data. php is the standard serializer of PHP. ; https://php.net/session.serialize-handler session.serialize_handler = php ; Defines the probability that the 'garbage collection' process is started on every ; session initialization. The probability is calculated by using gc_probability/gc_divisor, ; e.g. 1/100 means there is a 1% chance that the GC process starts on each request. ; Default Value: 1 ; Development Value: 1 ; Production Value: 1 ; https://php.net/session.gc-probability session.gc_probability = 1 ; Defines the probability that the 'garbage collection' process is started on every ; session initialization. The probability is calculated by using gc_probability/gc_divisor, ; e.g. 1/100 means there is a 1% chance that the GC process starts on each request. ; For high volume production servers, using a value of 1000 is a more efficient approach. ; Default Value: 100 ; Development Value: 1000 ; Production Value: 1000 ; https://php.net/session.gc-divisor session.gc_divisor = 1000 ; After this number of seconds, stored data will be seen as 'garbage' and ; cleaned up by the garbage collection process. ; https://php.net/session.gc-maxlifetime session.gc_maxlifetime = 1440 ; NOTE: If you are using the subdirectory option for storing session files ; (see session.save_path above), then garbage collection does *not* ; happen automatically. You will need to do your own garbage ; collection through a shell script, cron entry, or some other method. ; For example, the following script is the equivalent of setting ; session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): ; find /path/to/sessions -cmin +24 -type f | xargs rm ; Check HTTP Referer to invalidate externally stored URLs containing ids. ; HTTP_REFERER has to contain this substring for the session to be ; considered as valid. ; https://php.net/session.referer-check session.referer_check = ; Set to {nocache,private,public,} to determine HTTP caching aspects ; or leave this empty to avoid sending anti-caching headers. ; https://php.net/session.cache-limiter session.cache_limiter = nocache ; Document expires after n minutes. ; https://php.net/session.cache-expire session.cache_expire = 180 ; trans sid support is disabled by default. ; Use of trans sid may risk your users' security. ; Use this option with caution. ; - User may send URL contains active session ID ; to other person via. email/irc/etc. ; - URL that contains active session ID may be stored ; in publicly accessible computer. ; - User may access your site with the same session ID ; always using URL stored in browser's history or bookmarks. ; https://php.net/session.use-trans-sid session.use_trans_sid = 0 ; Set session ID character length. This value could be between 22 to 256. ; Shorter length than default is supported only for compatibility reason. ; Users should use 32 or more chars. ; https://php.net/session.sid-length ; Default Value: 32 ; Development Value: 26 ; Production Value: 26 session.sid_length = 26 ; The URL rewriter will look for URLs in a defined set of HTML tags. ; &lt;form&gt; is special; if you include them here, the rewriter will ; add a hidden &lt;input&gt; field with the info which is otherwise appended ; to URLs. &lt;form&gt; tag's action attribute URL will not be modified ; unless it is specified. ; Note that all valid entries require a "=", even if no value follows. ; Default Value: "a=href,area=href,frame=src,form=" ; Development Value: "a=href,area=href,frame=src,form=" ; Production Value: "a=href,area=href,frame=src,form=" ; https://php.net/url-rewriter.tags session.trans_sid_tags = "a=href,area=href,frame=src,form=" ; URL rewriter does not rewrite absolute URLs by default. ; To enable rewrites for absolute paths, target hosts must be specified ; at RUNTIME. i.e. use ini_set() ; &lt;form&gt; tags is special. PHP will check action attribute's URL regardless ; of session.trans_sid_tags setting. ; If no host is defined, HTTP_HOST will be used for allowed host. ; Example value: php.net,www.php.net,wiki.php.net ; Use "," for multiple hosts. No spaces are allowed. ; Default Value: "" ; Development Value: "" ; Production Value: "" ;session.trans_sid_hosts="" ; Define how many bits are stored in each character when converting ; the binary hash data to something readable. ; Possible values: ; 4 (4 bits: 0-9, a-f) ; 5 (5 bits: 0-9, a-v) ; 6 (6 bits: 0-9, a-z, A-Z, "-", ",") ; Default Value: 4 ; Development Value: 5 ; Production Value: 5 ; https://php.net/session.hash-bits-per-character session.sid_bits_per_character = 5 ; Enable upload progress tracking in $_SESSION ; Default Value: On ; Development Value: On ; Production Value: On ; https://php.net/session.upload-progress.enabled ;session.upload_progress.enabled = On ; Cleanup the progress information as soon as all POST data has been read ; (i.e. upload completed). ; Default Value: On ; Development Value: On ; Production Value: On ; https://php.net/session.upload-progress.cleanup ;session.upload_progress.cleanup = On ; A prefix used for the upload progress key in $_SESSION ; Default Value: "upload_progress_" ; Development Value: "upload_progress_" ; Production Value: "upload_progress_" ; https://php.net/session.upload-progress.prefix ;session.upload_progress.prefix = "upload_progress_" ; The index name (concatenated with the prefix) in $_SESSION ; containing the upload progress information ; Default Value: "PHP_SESSION_UPLOAD_PROGRESS" ; Development Value: "PHP_SESSION_UPLOAD_PROGRESS" ; Production Value: "PHP_SESSION_UPLOAD_PROGRESS" ; https://php.net/session.upload-progress.name ;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS" ; How frequently the upload progress should be updated. ; Given either in percentages (per-file), or in bytes ; Default Value: "1%" ; Development Value: "1%" ; Production Value: "1%" ; https://php.net/session.upload-progress.freq ;session.upload_progress.freq = "1%" ; The minimum delay between updates, in seconds ; Default Value: 1 ; Development Value: 1 ; Production Value: 1 ; https://php.net/session.upload-progress.min-freq ;session.upload_progress.min_freq = "1" ; Only write session data when session data is changed. Enabled by default. ; https://php.net/session.lazy-write ;session.lazy_write = On [Assertion] ; Switch whether to compile assertions at all (to have no overhead at run-time) ; -1: Do not compile at all ; 0: Jump over assertion at run-time ; 1: Execute assertions ; Changing from or to a negative value is only possible in php.ini! (For turning assertions on and off at run-time, see assert.active, when zend.assertions = 1) ; Default Value: 1 ; Development Value: 1 ; Production Value: -1 ; https://php.net/zend.assertions zend.assertions = 1 ; Assert(expr); active by default. ; https://php.net/assert.active ;assert.active = On ; Throw an AssertionError on failed assertions ; https://php.net/assert.exception ;assert.exception = On ; Issue a PHP warning for each failed assertion. (Overridden by assert.exception if active) ; https://php.net/assert.warning ;assert.warning = On ; Don't bail out by default. ; https://php.net/assert.bail ;assert.bail = Off ; User-function to be called if an assertion fails. ; https://php.net/assert.callback ;assert.callback = 0 [COM] ; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs ; https://php.net/com.typelib-file ;com.typelib_file = ; allow Distributed-COM calls ; https://php.net/com.allow-dcom ;com.allow_dcom = true ; autoregister constants of a component's typelib on com_load() ; https://php.net/com.autoregister-typelib ;com.autoregister_typelib = true ; register constants casesensitive ; https://php.net/com.autoregister-casesensitive ;com.autoregister_casesensitive = false ; show warnings on duplicate constant registrations ; https://php.net/com.autoregister-verbose ;com.autoregister_verbose = true ; The default character set code-page to use when passing strings to and from COM objects. ; Default: system ANSI code page ;com.code_page= ; The version of the .NET framework to use. The value of the setting are the first three parts ; of the framework's version number, separated by dots, and prefixed with "v", e.g. "v4.0.30319". ;com.dotnet_version= [mbstring] ; language for internal character representation. ; This affects mb_send_mail() and mbstring.detect_order. ; https://php.net/mbstring.language ;mbstring.language = Japanese ; Use of this INI entry is deprecated, use global internal_encoding instead. ; internal/script encoding. ; Some encoding cannot work as internal encoding. (e.g. SJIS, BIG5, ISO-2022-*) ; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. ; The precedence is: default_charset &lt; internal_encoding &lt; iconv.internal_encoding ;mbstring.internal_encoding = ; Use of this INI entry is deprecated, use global input_encoding instead. ; http input encoding. ; mbstring.encoding_translation = On is needed to use this setting. ; If empty, default_charset or input_encoding or mbstring.input is used. ; The precedence is: default_charset &lt; input_encoding &lt; mbstring.http_input ; https://php.net/mbstring.http-input ;mbstring.http_input = ; Use of this INI entry is deprecated, use global output_encoding instead. ; http output encoding. ; mb_output_handler must be registered as output buffer to function. ; If empty, default_charset or output_encoding or mbstring.http_output is used. ; The precedence is: default_charset &lt; output_encoding &lt; mbstring.http_output ; To use an output encoding conversion, mbstring's output handler must be set ; otherwise output encoding conversion cannot be performed. ; https://php.net/mbstring.http-output ;mbstring.http_output = ; enable automatic encoding translation according to ; mbstring.internal_encoding setting. Input chars are ; converted to internal encoding by setting this to On. ; Note: Do _not_ use automatic encoding translation for ; portable libs/applications. ; https://php.net/mbstring.encoding-translation ;mbstring.encoding_translation = Off ; automatic encoding detection order. ; "auto" detect order is changed according to mbstring.language ; https://php.net/mbstring.detect-order ;mbstring.detect_order = auto ; substitute_character used when character cannot be converted ; one from another ; https://php.net/mbstring.substitute-character ;mbstring.substitute_character = none ; Enable strict encoding detection. ;mbstring.strict_detection = Off ; This directive specifies the regex pattern of content types for which mb_output_handler() ; is activated. ; Default: mbstring.http_output_conv_mimetypes=^(text/|application/xhtml\+xml) ;mbstring.http_output_conv_mimetypes= ; This directive specifies maximum stack depth for mbstring regular expressions. It is similar ; to the pcre.recursion_limit for PCRE. ;mbstring.regex_stack_limit=100000 ; This directive specifies maximum retry count for mbstring regular expressions. It is similar ; to the pcre.backtrack_limit for PCRE. ;mbstring.regex_retry_limit=1000000 [gd] ; Tell the jpeg decode to ignore warnings and try to create ; a gd image. The warning will then be displayed as notices ; disabled by default ; https://php.net/gd.jpeg-ignore-warning ;gd.jpeg_ignore_warning = 1 [exif] ; Exif UNICODE user comments are handled as UCS-2BE/UCS-2LE and JIS as JIS. ; With mbstring support this will automatically be converted into the encoding ; given by corresponding encode setting. When empty mbstring.internal_encoding ; is used. For the decode settings you can distinguish between motorola and ; intel byte order. A decode setting cannot be empty. ; https://php.net/exif.encode-unicode ;exif.encode_unicode = ISO-8859-15 ; https://php.net/exif.decode-unicode-motorola ;exif.decode_unicode_motorola = UCS-2BE ; https://php.net/exif.decode-unicode-intel ;exif.decode_unicode_intel = UCS-2LE ; https://php.net/exif.encode-jis ;exif.encode_jis = ; https://php.net/exif.decode-jis-motorola ;exif.decode_jis_motorola = JIS ; https://php.net/exif.decode-jis-intel ;exif.decode_jis_intel = JIS [Tidy] ; The path to a default tidy configuration file to use when using tidy ; https://php.net/tidy.default-config ;tidy.default_config = /usr/local/lib/php/default.tcfg ; Should tidy clean and repair output automatically? ; WARNING: Do not use this option if you are generating non-html content ; such as dynamic images ; https://php.net/tidy.clean-output tidy.clean_output = Off [soap] ; Enables or disables WSDL caching feature. ; https://php.net/soap.wsdl-cache-enabled soap.wsdl_cache_enabled=1 ; Sets the directory name where SOAP extension will put cache files. ; https://php.net/soap.wsdl-cache-dir soap.wsdl_cache_dir="/tmp" ; (time to live) Sets the number of second while cached file will be used ; instead of original one. ; https://php.net/soap.wsdl-cache-ttl soap.wsdl_cache_ttl=86400 ; Sets the size of the cache limit. (Max. number of WSDL files to cache) soap.wsdl_cache_limit = 5 [sysvshm] ; A default size of the shared memory segment ;sysvshm.init_mem = 10000 [ldap] ; Sets the maximum number of open links or -1 for unlimited. ldap.max_links = -1 [dba] ;dba.default_handler= [opcache] ; Determines if Zend OPCache is enabled opcache.enable=1 ; Determines if Zend OPCache is enabled for the CLI version of PHP ;opcache.enable_cli=0 ; The OPcache shared memory storage size. ;opcache.memory_consumption=128 ; The amount of memory for interned strings in Mbytes. ;opcache.interned_strings_buffer=8 ; The maximum number of keys (scripts) in the OPcache hash table. ; Only numbers between 200 and 1000000 are allowed. ;opcache.max_accelerated_files=10000 ; The maximum percentage of "wasted" memory until a restart is scheduled. ;opcache.max_wasted_percentage=5 ; When this directive is enabled, the OPcache appends the current working ; directory to the script key, thus eliminating possible collisions between ; files with the same name (basename). Disabling the directive improves ; performance, but may break existing applications. ;opcache.use_cwd=1 ; When disabled, you must reset the OPcache manually or restart the ; webserver for changes to the filesystem to take effect. ;opcache.validate_timestamps=1 ; How often (in seconds) to check file timestamps for changes to the shared ; memory storage allocation. ("1" means validate once per second, but only ; once per request. "0" means always validate) ;opcache.revalidate_freq=2 ; Enables or disables file search in include_path optimization ;opcache.revalidate_path=0 ; If disabled, all PHPDoc comments are dropped from the code to reduce the ; size of the optimized code. ;opcache.save_comments=1 ; If enabled, compilation warnings (including notices and deprecations) will ; be recorded and replayed each time a file is included. Otherwise, compilation ; warnings will only be emitted when the file is first cached. ;opcache.record_warnings=0 ; Allow file existence override (file_exists, etc.) performance feature. ;opcache.enable_file_override=0 ; A bitmask, where each bit enables or disables the appropriate OPcache ; passes ;opcache.optimization_level=0x7FFFBFFF ;opcache.dups_fix=0 ; The location of the OPcache blacklist file (wildcards allowed). ; Each OPcache blacklist file is a text file that holds the names of files ; that should not be accelerated. The file format is to add each filename ; to a new line. The filename may be a full path or just a file prefix ; (i.e., /var/www/x blacklists all the files and directories in /var/www ; that start with 'x'). Line starting with a ; are ignored (comments). ;opcache.blacklist_filename= ; Allows exclusion of large files from being cached. By default all files ; are cached. ;opcache.max_file_size=0 ; Check the cache checksum each N requests. ; The default value of "0" means that the checks are disabled. ;opcache.consistency_checks=0 ; How long to wait (in seconds) for a scheduled restart to begin if the cache ; is not being accessed. ;opcache.force_restart_timeout=180 ; OPcache error_log file name. Empty string assumes "stderr". ;opcache.error_log= ; All OPcache errors go to the Web server log. ; By default, only fatal errors (level 0) or errors (level 1) are logged. ; You can also enable warnings (level 2), info messages (level 3) or ; debug messages (level 4). ;opcache.log_verbosity_level=1 ; Preferred Shared Memory back-end. Leave empty and let the system decide. ;opcache.preferred_memory_model= ; Protect the shared memory from unexpected writing during script execution. ; Useful for internal debugging only. ;opcache.protect_memory=0 ; Allows calling OPcache API functions only from PHP scripts which path is ; started from specified string. The default "" means no restriction ;opcache.restrict_api= ; Mapping base of shared memory segments (for Windows only). All the PHP ; processes have to map shared memory into the same address space. This ; directive allows to manually fix the "Unable to reattach to base address" ; errors. ;opcache.mmap_base= ; Facilitates multiple OPcache instances per user (for Windows only). All PHP ; processes with the same cache ID and user share an OPcache instance. ;opcache.cache_id= ; Enables and sets the second level cache directory. ; It should improve performance when SHM memory is full, at server restart or ; SHM reset. The default "" disables file based caching. ;opcache.file_cache= ; Enables or disables opcode caching in shared memory. ;opcache.file_cache_only=0 ; Enables or disables checksum validation when script loaded from file cache. ;opcache.file_cache_consistency_checks=1 ; Implies opcache.file_cache_only=1 for a certain process that failed to ; reattach to the shared memory (for Windows only). Explicitly enabled file ; cache is required. ;opcache.file_cache_fallback=1 ; Enables or disables copying of PHP code (text segment) into HUGE PAGES. ; Under certain circumstances (if only a single global PHP process is ; started from which all others fork), this can increase performance ; by a tiny amount because TLB misses are reduced. On the other hand, this ; delays PHP startup, increases memory usage and degrades performance ; under memory pressure - use with care. ; Requires appropriate OS configuration. ;opcache.huge_code_pages=0 ; Validate cached file permissions. ;opcache.validate_permission=0 ; Prevent name collisions in chroot'ed environment. ;opcache.validate_root=0 ; If specified, it produces opcode dumps for debugging different stages of ; optimizations. ;opcache.opt_debug_level=0 ; Specifies a PHP script that is going to be compiled and executed at server ; start-up. ; https://php.net/opcache.preload ;opcache.preload= ; Preloading code as root is not allowed for security reasons. This directive ; facilitates to let the preloading to be run as another user. ; https://php.net/opcache.preload_user ;opcache.preload_user= ; Prevents caching files that are less than this number of seconds old. It ; protects from caching of incompletely updated files. In case all file updates ; on your site are atomic, you may increase performance by setting it to "0". ;opcache.file_update_protection=2 ; Absolute path used to store shared lockfiles (for *nix only). ;opcache.lockfile_path=/tmp [curl] ; A default value for the CURLOPT_CAINFO option. This is required to be an ; absolute path. ;curl.cainfo = [openssl] ; The location of a Certificate Authority (CA) file on the local filesystem ; to use when verifying the identity of SSL/TLS peers. Most users should ; not specify a value for this directive as PHP will attempt to use the ; OS-managed cert stores in its absence. If specified, this value may still ; be overridden on a per-stream basis via the "cafile" SSL stream context ; option. ;openssl.cafile= ; If openssl.cafile is not specified or if the CA file is not found, the ; directory pointed to by openssl.capath is searched for a suitable ; certificate. This value must be a correctly hashed certificate directory. ; Most users should not specify a value for this directive as PHP will ; attempt to use the OS-managed cert stores in its absence. If specified, ; this value may still be overridden on a per-stream basis via the "capath" ; SSL stream context option. ;openssl.capath= [ffi] ; FFI API restriction. Possible values: ; "preload" - enabled in CLI scripts and preloaded files (default) ; "false" - always disabled ; "true" - always enabled ;ffi.enable=preload ; List of headers files to preload, wildcard patterns allowed. ;ffi.preload= </code></pre><p>复制以上配置内容到php.ini保存即可<br>注意保存php.ini后需要重启服务器以让配置生效</p><p>以上的PHP配置足够让Drupal 10正确运行了,但安装过程还是会提示“Clean URLs”警告,这是因为apache服务器没有配置URL重写,将URL重写成干净的链接会有更好的用户体验和SEO效果</p><p>此时你可以从下载的Drupal安装包中复制一份“.htaccess”文件到Drupal的web目录,或者新建“.htaccess”文件,其内容粘贴保存如下:</p><pre><code class="language-plaintext language-apache"># # Apache/PHP/Drupal settings: # # Protect files and directories from prying eyes. &lt;FilesMatch "\.(engine|inc|install|make|module|profile|po|sh|.*sql|theme|twig|tpl(\.php)?|xtmpl|yml)(~|\.sw[op]|\.bak|\.orig|\.save)?$|^(\.(?!well-known).*|Entries.*|Repository|Root|Tag|Template|composer\.(json|lock)|web\.config|yarn\.lock|package\.json)$|^#.*#$|\.php(~|\.sw[op]|\.bak|\.orig|\.save)$"&gt; &lt;IfModule mod_authz_core.c&gt; Require all denied &lt;/IfModule&gt; &lt;IfModule !mod_authz_core.c&gt; Order allow,deny &lt;/IfModule&gt; &lt;/FilesMatch&gt; # Don't show directory listings for URLs which map to a directory. Options -Indexes # Set the default handler. DirectoryIndex index.php index.html index.htm # Add correct encoding for SVGZ. AddType image/svg+xml svg svgz AddEncoding gzip svgz # Most of the following PHP settings cannot be changed at runtime. See # sites/default/default.settings.php and # Drupal\Core\DrupalKernel::bootEnvironment() for settings that can be # changed at runtime. &lt;IfModule mod_php.c&gt; php_value assert.active 0 &lt;/IfModule&gt; # Requires mod_expires to be enabled. &lt;IfModule mod_expires.c&gt; # Enable expirations. ExpiresActive On # Cache all files and redirects for 2 weeks after access (A). ExpiresDefault A1209600 &lt;FilesMatch \.php$&gt; # Do not allow PHP scripts to be cached unless they explicitly send cache # headers themselves. Otherwise all scripts would have to overwrite the # headers set by mod_expires if they want another caching behavior. This may # fail if an error occurs early in the bootstrap process, and it may cause # problems if a non-Drupal PHP file is installed in a subdirectory. ExpiresActive Off &lt;/FilesMatch&gt; &lt;/IfModule&gt; # Set a fallback resource if mod_rewrite is not enabled. This allows Drupal to # work without clean URLs. This requires Apache version &gt;= 2.2.16. If Drupal is # not accessed by the top level URL (i.e.: http://example.com/drupal/ instead of # http://example.com/), the path to index.php will need to be adjusted. &lt;IfModule !mod_rewrite.c&gt; FallbackResource /index.php &lt;/IfModule&gt; # Various rewrite rules. &lt;IfModule mod_rewrite.c&gt; RewriteEngine on # Set "protossl" to "s" if we were accessed via https://. This is used later # if you enable "www." stripping or enforcement, in order to ensure that # you don't bounce between http and https. RewriteRule ^ - [E=protossl] RewriteCond %{HTTPS} on RewriteRule ^ - [E=protossl:s] # Make sure Authorization HTTP header is available to PHP # even when running as CGI or FastCGI. RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # Block access to "hidden" directories whose names begin with a period. This # includes directories used by version control systems such as Subversion or # Git to store control files. Files whose names begin with a period, as well # as the control files used by CVS, are protected by the FilesMatch directive # above. # # NOTE: This only works when mod_rewrite is loaded. Without mod_rewrite, it is # not possible to block access to entire directories from .htaccess because # &lt;DirectoryMatch&gt; is not allowed here. # # If you do not have mod_rewrite installed, you should remove these # directories from your webroot or otherwise protect them from being # downloaded. RewriteRule "/\.|^\.(?!well-known/)" - [F] # If your site can be accessed both with and without the 'www.' prefix, you # can use one of the following settings to redirect users to your preferred # URL, either WITH or WITHOUT the 'www.' prefix. Choose ONLY one option: # # To redirect all users to access the site WITH the 'www.' prefix, # (http://example.com/foo will be redirected to http://www.example.com/foo) # uncomment the following: # RewriteCond %{HTTP_HOST} . # RewriteCond %{HTTP_HOST} !^www\. [NC] # RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # # To redirect all users to access the site WITHOUT the 'www.' prefix, # (http://www.example.com/foo will be redirected to http://example.com/foo) # uncomment the following: # RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] # RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301] # Modify the RewriteBase if you are using Drupal in a subdirectory or in a # VirtualDocumentRoot and the rewrite rules are not working properly. # For example if your site is at http://example.com/drupal uncomment and # modify the following line: # RewriteBase /drupal # # If your site is running in a VirtualDocumentRoot at http://example.com/, # uncomment the following line: # RewriteBase / # Redirect common PHP files to their new locations. RewriteCond %{REQUEST_URI} ^(.*)?/(install\.php) [OR] RewriteCond %{REQUEST_URI} ^(.*)?/(rebuild\.php) RewriteCond %{REQUEST_URI} !core RewriteRule ^ %1/core/%2 [L,QSA,R=301] # Rewrite install.php during installation to see if mod_rewrite is working RewriteRule ^core/install\.php core/install.php?rewrite=ok [QSA,L] # Pass all requests not referring directly to files in the filesystem to # index.php. RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !=/favicon.ico RewriteRule ^ index.php [L] # For security reasons, deny access to other PHP files on public sites. # Note: The following URI conditions are not anchored at the start (^), # because Drupal may be located in a subdirectory. To further improve # security, you can replace '!/' with '!^/'. # Allow access to PHP files in /core (like authorize.php or install.php): RewriteCond %{REQUEST_URI} !/core/[^/]*\.php$ # Allow access to test-specific PHP files: RewriteCond %{REQUEST_URI} !/core/modules/system/tests/https?\.php # Allow access to Statistics module's custom front controller. # Copy and adapt this rule to directly execute PHP files in contributed or # custom modules or to run another PHP application in the same directory. RewriteCond %{REQUEST_URI} !/core/modules/statistics/statistics\.php$ # Deny access to any other PHP files that do not match the rules above. # Specifically, disallow autoload.php from being served directly. RewriteRule "^(.+/.*|autoload)\.php($|/)" - [F] # Rules to correctly serve gzip compressed CSS and JS files. # Requires both mod_rewrite and mod_headers to be enabled. &lt;IfModule mod_headers.c&gt; # Serve gzip compressed CSS files if they exist and the client accepts gzip. RewriteCond %{HTTP:Accept-encoding} gzip RewriteCond %{REQUEST_FILENAME}\.gz -s RewriteRule ^(.*css_[a-zA-Z0-9-_])\.css$ $1\.css\.gz [QSA] # Serve gzip compressed JS files if they exist and the client accepts gzip. RewriteCond %{HTTP:Accept-encoding} gzip RewriteCond %{REQUEST_FILENAME}\.gz -s RewriteRule ^(.*js_[a-zA-Z0-9-_])\.js$ $1\.js\.gz [QSA] # Serve correct content types, and prevent double compression. RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1,E=no-brotli:1] RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1,E=no-brotli:1] &lt;FilesMatch "(\.js\.gz|\.css\.gz)$"&gt; # Serve correct encoding type. Header set Content-Encoding gzip # Force proxies to cache gzipped &amp; non-gzipped css/js files separately. Header append Vary Accept-Encoding &lt;/FilesMatch&gt; &lt;/IfModule&gt; &lt;/IfModule&gt; # Various header fixes. &lt;IfModule mod_headers.c&gt; # Disable content sniffing, since it's an attack vector. Header always set X-Content-Type-Options nosniff # Disable Proxy header, since it's an attack vector. RequestHeader unset Proxy &lt;/IfModule&gt; </code></pre><p>现在Drupal的安装检查就可以顺利通过,可以继续后续的安装了</p><p>&nbsp;</p><p>&nbsp;</p></div> <section data-drupal-selector="comments" class="comments"> <h2 class="comments__title">交流互动</h2> <div class="add-comment"> <div class="add-comment__form"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=375&amp;2=comment&amp;3=comment" token="jXm-O69DJXDP5C7YnCKU-_6udyiQ--FaM9ThY0YWRl0"></drupal-render-placeholder> </div> </div> </section> Thu, 06 Apr 2023 03:27:57 +0000 yunke 375 at http://indrupal.com http://indrupal.com/index.php/node/375#comments 知道吗?网页程序也可以跨程序(窗口)录屏 http://indrupal.com/index.php/node/365 <span>知道吗?网页程序也可以跨程序(窗口)录屏</span> <span><span>yunke</span></span> <span><time datetime="2022-11-02T14:09:44+08:00" title="2022-11-02 14:09 星期三">周三, 11/02/2022 - 14:09</time> </span> <div class="text-content clearfix field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>在网页里面运行的JS程序,也是可以做到跨程序录屏的,比如录制QQ聊天界面、PPT展示等等,作为资深开发者,你可能会立即思考JS能力和权限的问题,它怎么可能逃出浏览器,访问到其他程序了呢?这仰仗WebRTC技术,在用户授权下可安全使用。</p> <p>演示示例如下:<br /> <strong>屏幕录屏:</strong><br /> 加载的JS文件如下:</p> <pre> <code class="language-javascript"> const videoElem = document.getElementById("video"); const logElem = document.getElementById("log"); const startElem = document.getElementById("start"); const stopElem = document.getElementById("stop"); // Options for getDisplayMedia() var displayMediaOptions = { video: { cursor: "always" }, audio: false }; // Set event listeners for the start and stop buttons startElem.addEventListener("click", function (evt) { startCapture(); }, false); stopElem.addEventListener("click", function (evt) { stopCapture(); }, false); console.log = msg =&gt; logElem.innerHTML += `${msg}&lt;br&gt;`; console.error = msg =&gt; logElem.innerHTML += `&lt;span class="error"&gt;${msg}&lt;/span&gt;&lt;br&gt;`; console.warn = msg =&gt; logElem.innerHTML += `&lt;span class="warn"&gt;${msg}&lt;span&gt;&lt;br&gt;`; console.info = msg =&gt; logElem.innerHTML += `&lt;span class="info"&gt;${msg}&lt;/span&gt;&lt;br&gt;`; async function startCapture() { logElem.innerHTML = ""; try { videoElem.srcObject = await navigator.mediaDevices.getDisplayMedia(displayMediaOptions); dumpOptionsInfo(); } catch (err) { console.error("Error: " + err); } } function stopCapture(evt) { let tracks = videoElem.srcObject.getTracks(); tracks.forEach(track =&gt; track.stop()); videoElem.srcObject = null; } function dumpOptionsInfo() { const videoTrack = videoElem.srcObject.getVideoTracks()[0]; console.info("Track settings:"); console.info(JSON.stringify(videoTrack.getSettings(), null, 2)); console.info("Track constraints:"); console.info(JSON.stringify(videoTrack.getConstraints(), null, 2)); } </code></pre> <p>HTML内容如下:</p> <pre> <code>&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta http-equiv="content-type" content="text/html; charset=UTF-8"&gt; &lt;meta charset="utf-8"&gt; &lt;meta name="robots" content="noindex, nofollow"&gt; &lt;style&gt; body { padding: 0; margin: 0; } svg:not(:root) { display: block; } .playable-code { background-color: #f4f7f8; border: none; border-left: 6px solid #558abb; border-width: medium medium medium 6px; color: #4d4e53; height: 100px; width: 90%; padding: 10px 10px 0; } .playable-canvas { border: 1px solid #4d4e53; border-radius: 2px; } .playable-buttons { text-align: right; width: 90%; padding: 5px 10px 5px 26px; } &lt;/style&gt; &lt;style&gt; #video { border: 1px solid #999; width: 98%; max-width: 860px; } .error { color: red; } .warn { color: orange; } .info { color: darkgreen; } &lt;/style&gt; &lt;title&gt;使用屏幕捕获 API - simple_screen_capture - code sample&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;button id="start"&gt;Start Capture&lt;/button&gt;&amp;nbsp;&lt;button id="stop"&gt;Stop Capture&lt;/button&gt; &lt;video id="video" autoplay="autoplay"&gt;&lt;/video&gt; &lt;br&gt; &lt;strong&gt;Log:&lt;/strong&gt; &lt;br&gt; &lt;pre id="log"&gt;&lt;/pre&gt; &lt;script async src="capture.js"&gt;&lt;/script&gt; &lt;/body&gt; &lt;/html&gt; </code></pre> <p>访问以上网页试一试</p> <p><strong>文件录制:</strong></p> <pre> <code>&lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;MediaCapture and Streams API&lt;/title&gt; &lt;meta name="viewport" content="width=device-width"&gt; &lt;/head&gt; &lt;body&gt; &lt;header&gt; &lt;h1&gt;媒体捕获、媒体记录器和流API&lt;/h1&gt; &lt;/header&gt; &lt;main&gt; &lt;p&gt;&lt;button id="btnStart"&gt;开始录制&lt;/button&gt;&lt;br/&gt; &lt;button id="btnStop"&gt;停止录制&lt;/button&gt;&lt;/p&gt; &lt;video controls&gt;&lt;/video&gt; &lt;video id="vid2" controls&gt;&lt;/video&gt; &lt;/main&gt; &lt;script&gt; let constraintObj = { audio: false, video: { facingMode: "user", width: { min: 640, ideal: 1280, max: 1920 }, height: { min: 480, ideal: 720, max: 1080 } } }; //getUserMedia旧浏览器兼容 if (navigator.mediaDevices === undefined) { navigator.mediaDevices = {}; navigator.mediaDevices.getUserMedia = function(constraintObj) { let getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia; if (!getUserMedia) { return Promise.reject(new Error('getUserMedia is not implemented in this browser')); } return new Promise(function(resolve, reject) { getUserMedia.call(navigator, constraintObj, resolve, reject); }); } }else{ navigator.mediaDevices.enumerateDevices() .then(devices =&gt; { devices.forEach(device=&gt;{ console.log(device.kind.toUpperCase(), device.label); }) }) .catch(err=&gt;{ console.log(err.name, err.message); }) } navigator.mediaDevices.getUserMedia(constraintObj) .then(function(mediaStreamObj) { let video = document.querySelector('video'); if ("srcObject" in video) { video.srcObject = mediaStreamObj; } else { video.src = window.URL.createObjectURL(mediaStreamObj); } video.onloadedmetadata = function(ev) { video.play(); }; let start = document.getElementById('btnStart'); let stop = document.getElementById('btnStop'); let vidSave = document.getElementById('vid2'); let mediaRecorder = new MediaRecorder(mediaStreamObj); let chunks = []; start.addEventListener('click', (ev)=&gt;{ mediaRecorder.start(); console.log(mediaRecorder.state); }) stop.addEventListener('click', (ev)=&gt;{ mediaRecorder.stop(); console.log(mediaRecorder.state); }); mediaRecorder.ondataavailable = function(ev) { chunks.push(ev.data); } mediaRecorder.onstop = (ev)=&gt;{ let blob = new Blob(chunks, { 'type' : 'video/mp4;' }); chunks = []; let videoURL = window.URL.createObjectURL(blob); vidSave.src = videoURL; } }) .catch(function(err) { console.log(err.name, err.message); }); &lt;/script&gt; &lt;/body&gt; &lt;/html&gt; </code></pre> <p>该技术起源于谷歌,被用于基于网页的视频会议系统</p> </div> <section data-drupal-selector="comments" class="comments"> <h2 class="comments__title">交流互动</h2> <div class="add-comment"> <div class="add-comment__form"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=365&amp;2=comment&amp;3=comment" token="OEnLR5WacURfZGTUPVwhqD78mmST3iZqURx0Z1h4ouE"></drupal-render-placeholder> </div> </div> </section> Wed, 02 Nov 2022 06:09:44 +0000 yunke 365 at http://indrupal.com http://indrupal.com/index.php/node/365#comments