
PHP 7 安装注意事项 获取 PHP 7 主要有三种方式: 直接下载源代码并安装 安装预编译的二进制文件 安装 *AMP 集合包(比如:XAMPP、WAMP、LAMP、MAMP等等) 如何做 这三种方法按难易程度排列。然而,第一种方法虽然冗长乏味,但是可以让您对扩展和选项进行最有限的控制。 直接从源码安装 为了利用这种方法,您需要有一个 C 编译器。如果您运行的是 Windows,MinGW 是一个免费的编译器,它已经被证明很受欢迎。它基于 GNU 项目提供的 GNU 编译器集合(GCC)编译器。非免费的编译器包括Borland 公司的经典的 Turbo C 编译器,当然,Windows 开发者首选的编译器是 Visual Studio。不过,后者主要是为 C++ 开发设计的,所以在编译 PHP 时,需要指定 C 模式。 当在Apple Mac上工作时,最好的解决方案是安装 Apple Developer Tools。你可以使用 Xcode IDE 来编译 PHP 7,或者从终端窗口运行 gcc。在 Linux 环境下,从终端窗口运行 gcc。 当从终端窗口或命令行进行编译时,通常的过程如下: configure make make test make install 有关配置选项的信息(即在运行 configure 时) ,请使用 help选项: configure --help 在配置阶段可能遇到的错误如下表所示: 错误 修复 configure: error: xml2-config not found. Please check your libxml2 installation 你只需要安装 libxml2。对于这个错误,请参考以下链接:http://superuser.com/questions/740399/how-to-fix-php-installation-when-xml2-config-is-missing configure: error: Please reinstall readline - I cannot find readline.h 安装 libreadline-dev configure: WARNING: unrecognized options: --enable-spl, --enable-reflection, --with-libxml 没什么大不了的。这些选项是默认选项,不需要包括在内。有关详情,请参阅以下连结:http://jcutrer.com/howto/linux/how-to-compile-php7-on-ubuntu-14-04 从预编译的二进制文件安装 PHP 7 顾名思义,预编译的二进制文件是由别人从 PHP 7 源代码中编译出来的二进制文件。 如果是 Windows 系统,请访问 http://Windows.php.net/。您将在左侧栏中找到一组友好的提示,这些提示涉及选择哪个版本、线程安全与非线程安全等等。然后,您可以单击“Downloads” ,查找适用于您环境的 ZIP 文件。下载完 ZIP 文件后,将这些文件解压缩到您选择的文件夹中,将 php.exe 添加到路径中,并使用 php.ini 文件配置 PHP 7。 [[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VrsxVTNe-1603114760035)(https://github.com/AnyStudy/PHP-7-Real-World-Application-Development/raw/master/.gitbook/assets/image.png)]](https://github.com/AnyStudy/PHP-7-Real-World-Application-Development/blob/master/.gitbook/assets/image.png) 要在 Mac OS X 系统上安装预编译的二进制文件,最好使用软件包管理系统。对于 PHP 来说,推荐的有以下几种: MacPorts Liip Fink Homebrew 对于Linux,使用的打包系统取决于您使用的Linux发行版。 下表按 Linux 发行版组织,总结了在何处查找PHP 7 软件包。 Linux 发行版本 在哪里可以找到 PHP 7 备注 Debian packages.debian.org/stable/php`repos-source.zend.com/zend-server/early-access/php7/php-7DEB` 使用以下命令:sudo apt-get install php-7或者,您可以使用图形化的软件包管理工具,比如 Synaptic。确保选择 php7(而不是 php5)。 Ubuntu packages.ubuntu.com`repos-source.zend.com/zend-server/early-access/php7/php-7DEB` 使用以下命令:sudo apt-get install php7确保选择正确的Ubuntu版本。另外,您可以使用图形软件包管理工具,例如Synaptic。 Fedora / Red Hat admin.fedoraproject.org/pkgdb/packages`repos-source.zend.com/zend-server/early-access/php7/php-7RHEL` 确保您是 root 用户:su使用以下命令:dnf install php7另外,您可以使用图形化软件包管理工具,例如GNOME软件包管理器。 OpenSUSE software.opensuse.org/package/php7 使用以下命令: yast -i php7或者,您可以运行 zypper ,或将 YaST 用作图形工具。 通过 *AMP 集合包安装 AMP 指的是 Apache、 MySQL 和 PHP (也包括 Perl 和 Python)。 指的是 Linux、 Windows、 Mac 等(即 LAMP、 WAMP 和 MAMP)。这种方法通常是最简单的,但是对初始 PHP 安装的控制较少。另一方面,您可以随时修改 php.ini 文件并安装其他扩展,以根据需要定制安装。下表总结了一些流行的 AMP 包: 集合包 在哪里可以找到 是否免费 支持* XAMPP www.apachefriends.org/download.html Y WML AMPPS www.ampps.com/downloads Y WML MAMP www.mamp.info/en Y WM WampServer sourceforge.net/projects/wampserver Y W EasyPHP www.easyphp.org Y W Zend Server www.zend.com/en/products/zend_server N WML 在上表中,我们列出了 AMP 软件包,其中 替换为Windows的W,Mac OS X的M和Linux的L。 更多... 当从包中安装预编译的二进制文件时,只安装核心扩展。非核心 PHP 扩展必须单独安装。 值得注意的是,在云计算平台上安装 PHP 7 通常会遵循预编译二进制文件的安装过程。找出您的云环境是否使用 Linux、 Mac 或 Windows 虚拟机,然后按照本文中提到的适当步骤进行操作。 有可能 PHP 7 预编译二进制文件这种安装方式并不是您所喜欢的。但您始终可以从源码中安装,或者考虑安装一个 *AMP 集合包(见下一节)。对于基于Linux的系统来说,另一种选择是使用个人软件包存档(PPA)的方法。然而,由于PPA没有经过严格的筛选过程,安全性可能是一个问题。关于PPA的安全考虑因素的良好讨论见http://askubuntu.com/questions/35629/are-ppas-safe-to-add-to-my-system-and-what-are-some-red-flags-to-watch-out-fo。 参考 一般的安装注意事项,以及三个主要操作系统平台(Windows,Mac o s x 和 Linux)的说明,可以在 http://php.net/manual/en/install.general.php 中找到。 MinGW 的网站是 http://www.mingw.org/。 关于如何使用 Visual Studio 编译 c 程序的说明可以在 https://msdn.microsoft.com/en-us/library/bb384838 中找到。 测试 PHP 7 的另一种可能的方法是使用虚拟机。下面是一些工具和链接,这些工具可能会被证明是有用的: Vagrant:https://github.com/rlerdorf/php7dev (php7dev是一个Debian 8 Vagrant 镜像,它已被预先配置用于测试PHP应用程序和开发跨多个PHP版本的扩展) Docker:https://hub.docker.com/r/coderstephen/php7/ (它包含一个PHP7 Docker容器) **如果您喜欢本文,请到github点个star吧!https://github.com/AnyStudy/PHP-7-Real-World-Application-Development**
前言 PHP 7:真实世界的应用开发(中文翻译) 作者:Doug Bierer, Altaf Hussain, Branko Ajzele 原书名称:《PHP 7: Real World Application Development》 译者:金弘扬(ganymedenil@gmail.com) Gitbook地址:PHP 7:真实世界的应用开发 github:https://github.com/AnyStudy/PHP-7-Real-World-Application-Development 推荐使用 Gitbook 以获取最佳阅读体验。 译序 作为一个使用了php多年的程序员,公司项目也经历过5到7的升级,期间项目也出现过一些因为php7功能与php5 不一致导致的bug。我一直在寻找一本能详细介绍 php 7 新特性与功能的书,后来找到了这本,虽然这本书发布到现在已经差不多4年了,但是对于想详细了解php7的朋友来说里面所讲述的内容我认为还是很有价值的。并且本书作者的一些观点我也非常认同,就想着希望能让更多人看到,趁着十一假期有时间想试着翻译一下本书。本书实际是三本独立的书,但如果单独看这三本都感觉缺点什么,把这三本书合并为一本我感觉就很相辅相成。本书的模块2也就是《高性能 php 7》部分已经由吕毅老师翻译,本人就不再对本模块进行翻译。如果我的翻译能帮助到大家,也是我最大到荣幸。 前言 PHP 7 在开源社区掀起了一场风暴,它打破了之前版本的速度记录,也重新引起了人们对它的关注。从最根本的意义上讲,核心工程团队已经对它进行了重大重写,但仍能保持高度的向后兼容性。PHP是一门开发Web应用的好语言。它本质上是一类服务器端脚本语言,也用于通用编程。PHP 7是最新的版本,提供了主要的向后兼容性突破,并专注于提高性能和速度。这意味着你可以通过多线程网络服务器,用低成本的硬件和服务器维持网站的高流量。 这条学习之路都涵盖了什么 模块1,PHP 7 编程指南,本模块以 PHP 7 为中心,展示了中高级的PHP技术。每个示例都是为了解决像您这样的 PHP 开发人员每天面临的实际问题。其中还介绍了只有在 PHP 7 中才有的,新的编写 PHP 代码的方法。此外,我们还讨论了向后兼容性中断的问题,并为您提供了大量指导,告诉您何时何地需要修改 PHP 5 代码,以便在 PHP 7 下运行时产生正确的结果。本模块还包含了最新的 PHP 7.x 特性。在本模块结束时,您将具备为您的网站和企业提供高效应用程序所需的工具和技能。 模块2,学习 PHP 7 高性能,该模块是 PHP 7 的快速入门,这将提高您的生产力和编码技能。所涉及的概念将使您作为一个PHP程序员,提高你的应用程序的性能标准。我们将向您介绍 PHP 7 中的新特性,然后介绍 PHP 7 中面向对象编程(OOP)的概念。接下来,我们将阐明如何提高 PHP 7 应用程序的性能和数据库性能。通过这个模块,您将能够使用模块中讨论的各种基准测试工具来提高程序的性能。最后,模块讨论了 PHP 编程中的一些最佳实践,以帮助你提高代码的质量。 模块3,用 PHP 7 更新旧版应用程序,此模块将向您展示如何通过提取和替换旧版组件,从实践和技术上而不是在使用框架和库之类的工具方面对应用程序进行升级。 我们将采用循序渐进的方法,有条不紊地缓慢前进,从根本上改善您的应用程序。我们将向您展示依赖注入是如何替换新的和全局依赖的。我们还将向您展示如何将表示逻辑改为视图文件,将动作逻辑改为控制器。此外,我们将使您的应用程序始终保持运行状态。在这个过程中,每一个完成的步骤都会让您的代码库以更高的质量完全正常运行。当我们完成后,您将能够像风一样轻而易举地通过您的代码。您的代码将是自动加载、依赖注入、单元测试、层级分离和前端控制。我们将添加到您的应用程序中的大多数非常有限的代码都是针对这个模块的。我们将以程序员的身份提高自己,并提高传统应用程序的质量。 你在这条学习之路上需要什么 模块1 要成功地实现本模块中介绍的示例,你只需要一台计算机,100MB 的额外磁盘空间,和一个文本或代码编辑器(不是文字处理器!)。第一章将介绍如何设置 PHP 7 开发环境。拥有一个 Web 服务器是可选的,因为 PHP 7 包含一个开发 Web 服务器。不需 Internet 连接,但下载代码(如 PSR-7 接口集)和查看 PHP 7.x 文档可能会需要。 模块2 任何符合运行以下软件最新版本的硬件规格,应该都足以通过本模块。 操作系统: Debian 或 Ubuntu 软件: NGINX、PHP 7、 MySQL、 PerconaDB、 Redis、 Memcached、 Xdebug、Apache JMeter、 ApacheBench、Siege 和 Git 模块3 您需要参考本模块的“第二章,先决条件“来了解本模块所需的基本硬件和软件要求。本章将详细描述这些要求。 这条路是为谁而设 如果您是一个有抱负的Web开发人员,移动应用开发人员或后端程序员,并且具有PHP编程的基本经验并希望开发对性能至关重要的应用程序,那么这个课程是为你准备的。它将使您的PHP编程技能更上一层楼。 支持 课程的代码包也托管在github上 https://GitHub.com/packtpublishing/php-7-be-pro-at-applications-development 。 法律申明 译者纯粹出于学习目的与个人兴趣翻译本书,不追求任何经济利益。 译者保留对此版本译文的署名权,其他权利以原作者和出版社的主张为准。 本译文只供学习研究参考之用,不得公开传播发行或用于商业用途。有能力阅读英文书籍者请购买正版支持。 LICENSE CC-BY 4.0
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_21158419/article/details/83176323 我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
一开始搜索输入法问题全是替换自身jre,实际完全不行。因为2017.2系列是输入法兼容问题,目前只有最新版qq输入法是完全ok的,但是需要将输入法模式切换为 单行输入模式 才能在输入时显示选择框。 参考 https://www.oschina.net/news/86937/phpstorm-2017-2-released
为了bash on Windows 而装了windows 10 。但在配置LNMP环境的时候出现了问题。 状况 静态网页加载没有问题 但是访问php却会出现keeps waiting for a request finish最终游览器报net::ERR_INCOMPLETE_CHUNKED_ENCODING错误的情况。 更改了一堆参数无效,最后还是在官方的github上找到解决方法。 解决 nginx.conf http { ... fastcgi_buffering off; ... } 重启nginx与php-fpm即可解决。 参考 https://github.com/Microsoft/BashOnWindows/issues/1851#issuecomment-294299975
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_21158419/article/details/53610445 问题 Laravel说明文档中的 Redis 发布与订阅案例,命令行运行php artisan redis:subscribe 到60s自动断开并报错 [Predis\Connection\ConnectionException] Error while reading line from the server. [tcp://127.0.0.1:6379] 解决 在config/database.php配置文件中,找到redis配置项,添加一行如下 'redis' => [ 'cluster' => false, 'default' => [ 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => 0, 'read_write_timeout' => 0,//new ], ] 原因 据Predis作者在配置文件中说明,因为在底层网络资源上执行读取或写入操作时使用了超时,默认设置了timeout 为60s。 参考 https://github.com/nrk/predis/wiki/Connection-Parameters
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_21158419/article/details/53456088 1.安装配置xdebug 直接使用pecl安装即可 # pecl install xdebug 然后写xdebug配置,下面是我的设置(具体扩展路径以你安装完后提示的路径为准) [xdebug] zend_extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/xdebug.so xdebug.remote_enable = 1 xdebug.remote_host=192.168.220.128(你运行xdebug服务器的外网ip,这里是我在虚拟机测试的地址) xdebug.remote_connect_back = 1 xdebug.remote_port = 9000 保存重启php 2.配置运行DBGp proxy 首先下载,下载地址,我在这选择的是Komodo IDE 10 (version 10.1.2)然后是Python Remote Debugging Client Linux (x86_64) ,可以按照你的系统需求选择下载,但推荐选择python版本而不是其他的,因为这篇文章是按python版写的╭(′▽`)╯ 下载完解包进入目录,别着急运行,先测试一下包是否已经导入 python -c "import dbgp.client; print 'ok'" 如果没显示ok而是显示错误就代表没导入 编辑/etc/profile(具体目录按照你解压目录为准,我这是root下的PythonRemoteDebugging目录,因为我的centos 7 的默认python 版本是2.7所以我导入的包目录是pythonlib,如果你是3的改成python3lib) export PYTHONPATH=/root/PythonRemoteDebugging/pythonlib 继续上一步测试是否显示ok 好了现在可以运行了 ./pydbgpproxy -d 127.0.0.1:9000 -i 192.168.220.128:9001 如果显示类似的信息代表运行成功,如果错误一般提醒端口已被占用换个端口即可 INFO: dbgp.proxy: starting proxy listeners. appid: 3583 INFO: dbgp.proxy: dbgp listener on 127.0.0.1:9000 INFO: dbgp.proxy: IDE listener on 192.168.220.128:9001 好了最后一步,开放9001端口 编辑/etc/sysconfig/iptables 加一条规则 -A INPUT -p tcp -m state --state NEW -m tcp --dport 9001 -j ACCEPT 重启iptables 让规则生效 然后运行pydbgpproxy 3.设置PhpStorm 打开 Tools->DBGp proxy->configuration IDE key 是用来区分不同用户的 只要每个人的不重复就可以了 Host 这个就是pydbgpproxy中指定的外网ip,我这是192.168.220.128 Port pydbgpproxy中指定的端口,我这是9001 保存后,我们还得注册一下 点击Tools->DBGp proxy->register IDE 显示以下内容,表示注册成功 IDE successfully registered with ide key 'PHPSTORM' 好了 现在可以跟小伙伴们愉快的在远程开发机上享受xdebug了\(^o^)/ 参考网站: https://xdebug.org/docs/install http://docs.komodoide.com/Manual/debugpython https://confluence.jetbrains.com/display/PhpStorm/Multi-user+debugging+in+PhpStorm+with+Xdebug+and+DBGp+proxy
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_21158419/article/details/53168027 以官方文档中间件篇的年龄为例子进行了修改 路由部分 Route::get('test/age/{age}',[ 'middleware' => 'old', 'uses'=>'Test@test' ]); 直接抄文档了 如果你要指派中间件给特定路由,你得先在 app/Http/Kernel.php 给中间件设置一个好记的 键,默认情况下,这个文件内的$routeMiddleware 属性已包含了 Laravel 目前设置的中间件,你只需要在清单列表中加上一组自定义的键即可。 Kernel部分 protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'old'=>\App\Http\Middleware\OldMiddleware::class //增加 ]; 中间件部分 public function handle($request, Closure $next) { //$age = $request->route('age'); $age = $request->age;//两者均可 if($age<=200) { echo '<=200'; die(); } return $next($request); } 控制器部分 public function test($age) { echo $age; } 整个访问流程 用户输入(例http://localhost/test/age/1) 被中间件捕获,判断age值如果小于则直接输出"<=200",然后停止往下传值,反之通过判断继续往下传值 age值传入到控制器 直接打印输出
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_21158419/article/details/52926595 在github上搜到一个正文提取程序,测试了一下基本可以对现在大多数大型新闻网站进行提取 后续我会分析一下这个程序的源码 使用非常简单 如下 # -*- coding: utf-8 -*- import newspaper url = 'http://news.haiwainet.cn/n/2015/0611/c3541083-28826526.html' a = newspaper.Article(url,language='zh') a.download() a.parse() print(a.text) github:https://github.com/codelucas/newspaper
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_21158419/article/details/52891071 搜了一圈也没找到redis 对于 php 7 windows 扩展,最后还是在apache lounge论坛找到了php7全扩展包 本人把里面的扩展全进行了上传(下载见本文底部) 在这里主要讲讲 php 7 的redis 扩展的安装 实际和之前5.x一样 首先辨认自己的php7是nts还是ts 这个可以在phpinfo 里的PHP Extension Build 看到 是x86还是x64这个不在叙述 然后把php_igbinary.dll和php_redis.dll(包括同名的pdb文件)下载后扔到php目录的ext下即可 最后在php.ini里添加以下两行 注意上下位置 extension=php_igbinary.dll extension=php_redis.dll 重启即可在phpinfo中找到redis扩展 虽然这扩展是RC版本但是在开发环境而言也无伤大雅 最后附上 github 下载地址 https://github.com/canyuexiang/php7-win-ext
虚拟机操作系统:centos7.0 命令行模式 1.首先明确centos7在最小化安装完是不支持上网的,相应的查看网络以及修改网络参数是不能使用的,最常见的就是我们常用的ifconfig。 2.找到网络配置模块的配置文件:/etc/sysconfig/network-scripts/ifcfg-enp*** 3.使用vi或者vim编辑器打开该配置文件 3.1 将BOOTPROTO设置为动态的,即:BOOTPROTO=dhcp 将ONBOOT设置为yes即:ONBOOT=yes 3.2 保存退出:shift+z 按两次 3.3 重启网络命令:service network restart 或者重启linux系统 3.4 查看网络 ip addr
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_21158419/article/details/52714203 最近打算开一个自己的CMS后台轮子,框架选择了thinkphp 5 (别问我为什么选择这个框架)然后想边开发边记录一下,方便自己方便他人 进入正题 1.数据库设计 一共三张表 post文章表这个就不贴了(在这里没有使用到) 主要是以下两张 一张是存储标签的tag表, 另一张是关系表用于关联标签与文章 2.代码部分 主要我们使用到了thinkphp5的多对多关联(想详细了解的可以看这里 多对多关联) 文章表对应的模型 model/Posts.php <?php namespace app\admin\model; use think\Model; class Posts extends Model { protected function initialize() { parent::initialize(); } public function tag() { return $this->belongsToMany('Tags', 'tag_relationships'); } }主要是tag这个函数通过belangsTomany把文章表与标签和关系表做个关联 因为我们还要做到标签找到相关文章我们还得给标签模型加个关联 标签表对应模型 model/Tags.php <?php namespace app\admin\model; use think\Model; class Tags extends Model { protected function initialize() { parent::initialize(); } public function post() { return $this->belongsToMany('Posts', 'tag_relationships'); } } 一样的道理不在叙述 下面开始控制器部分 先写新发表文章的标签部分 controller/Post.php public function doadd(Request $request) { <span style="white-space:pre"> </span>//文章部分不再贴出,但需要先进行写入然后返回文章uid $result = $request->param(); $re_tags = explode(',', $result['tags']); // 标签写入 for ($i=0; $i <count($re_tags); $i++) { $data[]=['name'=>$re_tags[$i]]; } $post = PostAdminModel::get($uid); $post->tag()->saveAll($data); }说明 $result //post数组 $uid //文章储存完后返回来的主键uid 因为前端标签插件发送的数据格式是通过逗号分隔,所以我们接收到数据后转换为['key'=>'value'](在代码中name是我标签表中标签名字对应的键值名)方便接下来的操作 接下来就是通过Post模型静态调用get方法(默认输入为主键) 然后通过批量增加关联数据操作把刚才我们组合的标签数组传进来 这样新增就完成了 接下来我们开始写编辑页的标签操作 在这里我们先分析一下我们的标签可能的操作 1.删除标签但不删除标签库中的 2.新增标签但是不存在于标签表中 3.新增标签但是存在于标签表中 4.取出全部标签 public function edit($uid) { if (Request::instance()->isPost()) { $request = Request::instance(); $result = $request->param(); //标签 Start $re_tags = $result['tags']; $taglist = explode(',',$re_tags); $post = PostAdminModel::get($uid); foreach($post->tag as $value) { $orglist[] = $value['name']; } //删除标签 <pre name="code" class="php"> //文章的关联标签与前端传递过来的标签进行对比(顺序不能错了)如果存在值则进行删除操作 $dellist=array_diff($orglist,$taglist); if($dellist) { foreach($dellist as $value) //删除关联操作 $tag = TagsAdminModel::getByName($value); $post->tag()->detach($tag); } //增加标签 //与之前的比较相反即增加操作 $addlist=array_diff($taglist,$orglist); if($addlist) { foreach($addlist as $value) { <span style="white-space:pre"> </span> //标签存在于标签库中则只增加关联,不存在则新增 $tagresult= TagsAdminModel::getByName($value); if($tagresult) { $tagid = $tagresult->value('id'); $post->tag()->attach($tagid); }else{ $post->tag()->save(['name'=>$value]); } } } //标签 End } } //渲染获取文章数据 //因为我们进行了关联所以可以直接通过查询文章表并获取到标签集 $request=PostAdminModel::get($uid); $tags=""; for ($i=0; $i <count($request->tag); $i++) { $tags .= $request->tag[$i]['name'].','; } $this->assign('tags', $tags); return $this->fetch(); } 改说的都写在注释里了 其实关于后台的标签操作还有就是单独对于标签的操作 这个就相对简单了直接操作标签的增加删除修改即可 但是在删除的时候一定要注意先进行关联删除再进行标签的删除 前端显示就是文章本身的标签显示这个也简单 还有就是标签反查文章基本方法我在上面都写了 可以按照需求进行修改即可 不出意外我后续还会续上 写的可能很啰嗦很乱 大家凑活看吧~ 有问题可以留言问
问题 当在命令行运行PHP的CLI版本时,您可能会收到类似以下错误: [root@myserver /root]$ php -v PHP Warning: Module 'pcre' already loaded in Unknown on line 0 PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/spl.so' - /usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/spl.so: Undefined symbol "pcre_exec" in Unknown on line 0 PHP Warning: Module 'SimpleXML' already loaded in Unknown on line 0 PHP Warning: Module 'session' already loaded in Unknown on line 0 PHP Warning: Module 'exif' already loaded in Unknown on line 0 PHP 5.2.3 (cli) (built: Jun 14 2007 15:29:17) Copyright (c) 1997-2007 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies 原因 在PHP中对于大多数扩展而言加载有两种方法。一种是直接编译扩展到PHP二进制文件。另一种是通过一个ini文件动态加载的共享扩展。这些错误表明,动态扩展正在通过.ini文件加载,即使它们已经被编译到PHP二进制文件中。 修复 要解决此问题,您必须编辑你的php.ini(或extensions.ini文件)文件并注释掉那些已经编译的扩展。例如,修改完成后,你的ini文件修改完可能看起来像下面这几行: ;extension=pcre.so ;extension=spl.so ;extension=simplexml.so ;extension=session.so ;extension=exif.so 当然你也可以删除这些行,而不是注释掉。一但你注释或删除掉这些行,再运行php -v 警告消失。 附加信息 要了解哪些扩展已经编译到你的PHP中,运行以下命令: php -m 您还可以查看configure命令,它会显示通过编译、建成共享或动态模块启动的扩展。 php -i | grep Configure 动态扩展通常位于一个特殊的“extensions”的文件夹中,其会根据操作系统环境而变化。你的php.ini通常有一行会显示这个说明文件夹。例如: Directory in which the loadable extensions (modules) reside. extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/" 原文连接 http://www.somacon.com/p520.php
如在安装过程中碰到未找到gcc 或者 kernel headers的可按以下方案解决,适用任意版本 CentOS 7 1. Update the kernel: $ yum update kernel -y 2. Install the kernel-headers, kernel-devel and other required packages: $ yum install kernel-headers kernel-devel gcc make -y 3. Reboot the server to make sure it load to the new kernel: $ init 6 4. The kernel version has been updated including the kernel-headers and kernel-devel: # rpm -qa|grep -e kernel-devel -e kernel-headers kernel-devel-3.10.0-327.18.2.el7.x86_64 kernel-headers-3.10.0-327.18.2.el7.x86_64 # uname -r 3.10.0-327.18.2.el7.x86_64 fyi:http://blog.secaserver.com/2011/09/linux-vmware-tools-installation-error Debian 8.5 sudo apt-get install make gcc sudo aptitude install linux-headers-`uname -r`
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_21158419/article/details/51744653 这几天接到了一个数据采集的项目 通过对网站的前期分析得到以下内容 1.网站本身采用.NET开发 2.需抓取内容采用DES加密 虽然得到了前端javascript的加解密算法,但大家也知道跨语言算法想要交互开发难度是相当大的。原打算修改现有php DES算法进行匹配发现难度太大,费时费力。后突然想到是否可以在php中调用js脚本来处理,这也就是本文章重点了phantomjs。其实很简单 第一版本打开网页直接执行解码方法,但用这种方法处理速度会被拉慢,毕竟有个网页访问的过程,之后就想是否可以调用本地自己构造的网页来进行同等的处理呢,我在Windows上测试是可行的,暂未在liunx上进行测试。 首先构造本地网页非常简单,就是一个引用解码脚本的空html文档,名为Demo.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script type="text/javascript" src="webdes.js"></script> </head> <body> </body> </html> 然后开始写phantomjs处理脚本,名为Model.js var page = require('webpage').create(); page.open('Demo.html', function (status) { if(status !== 'success' ){ console.log('FAIL'); }else{ var a = '{keys}'; var b = '{encrypt}'; console.log(page.evaluate(function(c,d){ return jsdecrypt(c,d); },a,b)); } phantom.exit(); }); 通过phantomjs的api page.evaluate来执行解密方法 ,原打算直接通过命令行直接传参数,发现无法成功,猜测因为加密字符串大小超过命令行最大字符长度。所以只能通过php读入js文件再进行替换了。 最后就是php部分 //模板数据替换 $str=file_get_contents("Model.js");//打开文件 $str=str_replace("{keys}",$a,$str); $str=str_replace("{encrypt}",$b,$str); file_put_contents("Decode.js",$str);//把替换的内容写到js文件中 //解码操作 $command = "phantomjs Decode.js"; print_r (passthru($command)); //因为输出内容为多行所以使用passthru方法 最后说明一下这种方法毕竟是调用第三方程序来处理,肯定比不上原生直接写算法要快,但速度还是可以接受的 我也就抛砖引玉一下,这个模板可以直接套用。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_21158419/article/details/51670813 比较偷懒的调用方式 <textarea name="content"></textarea> {:hook('documentEditFormContent',array('name'=>'content'))}
我采用了PHP序列化的方式进行存储 下文也提到了多种方式可以做参考 http://www.nowamagic.net/librarys/veda/detail/2153
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_21158419/article/details/51118506 算法整理 // 使用到的加密算法// function rc4(a, b) { for (var c, d = [], e = 0, f = "", g = 0; 256 > g; g++) d[g] = g; for (g = 0; 256 > g; g++) e = (e + d[g] + a.charCodeAt(g % a.length)) % 256, c = d[g], d[g] = d[e], d[e] = c; g = 0, e = 0; for (var h = 0; h < b.length; h++) g = (g + 1) % 256, e = (e + d[g]) % 256, c = d[g], d[g] = d[e], d[e] = c, f += String.fromCharCode(b.charCodeAt(h)^d[(d[g] + d[e]) % 256]); return f } function translate(a, b) { for (var c = [], d = 0; d < a.length; d++) { var e = 0; e = a[d] >= "a" && a[d] <= "z" ? a[d].charCodeAt(0) - "a".charCodeAt(0) : a[d] - "0" + 26; for (var f = 0; 36 > f; f++) if (b[f] == e) { e = f; break } e > 25 ? c[d] = e - 26 : c[d] = String.fromCharCode(e + 97) } return c.join("") } function decode64(a) { if (!a) return ""; a = a.toString(); var b, c, d, e, f, g, h, i = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1); for (g = a.length, f = 0, h = ""; g > f; ) { do b = i[255 & a.charCodeAt(f++)]; while (g > f && -1 == b); if (-1 == b) break; do c = i[255 & a.charCodeAt(f++)]; while (g > f && -1 == c); if (-1 == c) break; h += String.fromCharCode(b << 2 | (48 & c) >> 4); do { if (d = 255 & a.charCodeAt(f++), 61 == d) return h; d = i[d] } while (g > f && -1 == d); if (-1 == d) break; h += String.fromCharCode((15 & c) << 4 | (60 & d) >> 2); do { if (e = 255 & a.charCodeAt(f++), 61 == e) return h; e = i[e] } while (g > f && -1 == e); if (-1 == e) break; h += String.fromCharCode((3 & d) << 6 | e) } return h } function encode64 (a) { if (!a) return ""; a = a.toString(); var b, c, d, e, f, g, h = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; for (d = a.length, c = 0, b = ""; d > c; ) { if (e = 255 & a.charCodeAt(c++), c == d) { b += h.charAt(e >> 2), b += h.charAt((3 & e) << 4), b += "=="; break } if (f = a.charCodeAt(c++), c == d) { b += h.charAt(e >> 2), b += h.charAt((3 & e) << 4 | (240 & f) >> 4), b += h.charAt((15 & f) << 2), b += "="; break } g = a.charCodeAt(c++), b += h.charAt(e >> 2), b += h.charAt((3 & e) << 4 | (240 & f) >> 4), b += h.charAt((15 & f) << 2 | (192 & g) >> 6), b += h.charAt(63 & g) } return b } //YKP.userCache.sid & YKP.userCache.token 算法// YK.mk.a3 = "b4et" YKP.userCache.a1 = 4 d = [19, 1, 4, 7, 30, 14, 28, 8, 24, 17, 6, 35, 34, 16, 9, 10, 13, 22, 32, 29, 31, 21, 18, 3, 2, 23, 25, 27, 11, 20, 5, 15, 12, 0, 33, 26] b.security.encrypt_string = json数据中的security.encrypt_string值 e = rc4(translate(YK.mk.a3 + "o0b" + YKP.userCache.a1, d).toString(), decode64(b.security.encrypt_string)) YKP.userCache.sid = e.split("_")[0] YKP.userCache.token = e.split("_")[1] //n为视频分段数量// n获取方式 n = v.toString(16) v = json数据表 stream 数组通过下面的m值确定格式再在对应格式内部获取segs数组的成员数 //m为视频格式// m获取方式 先从json数据表 stream 数组中获取 stream_type的值 通过stream_type的值查询字典l l = { flv : "flv", mp4 : "mp4", hd2 : "flv", mp4hd : "mp4", mp4hd2 : "mp4", "3gphd" : "mp4", "3gp" : "flv", flvhd : "flv" } 得到m值 //e为视频段主要数据// o.stream_fileid 获取方式 json数据表 stream 数组通过下面的m值确定格式再在对应格式内部获取stream_fileid值 e = getFileId(o.stream_fileid, v) getFileId : function (a, b) { if (null == a || "" == a) return ""; var c = "", d = a.slice(0, 8), e = b.toString(16); 1 == e.length && (e = "0" + e), e = e.toUpperCase(); var f = a.slice(10, a.length); return c = d + e + f } //p值// 1.新算法 p = h.segs[v].key; h = c.stream[a] 2.旧算法 p = h.key2 + h.key1 //k值// 先从json数据表 stream 数组中获取 stream_type的值d 通过stream_type的值查询字典j k = j[d] j = { flv : 0, flvhd : 0, mp4 : 1, hd2 : 2, "3gphd" : 1, "3gp" : 0 } //o值// o = h.segs[b].total_milliseconds_video / 1e3 //YK.v.data.security.ip// json数据表 security中获取ip //t值// YK.mk.a4 = "boa4" YKP.userCache.a2 = 1 s = d t = encodeURIComponent(encode64(rc4(translate(YK.mk.a4 + "poz" + YKP.userCache.a2, s).toString(), YKP.userCache.sid + "_" + e + "_" + YKP.userCache.token))); 不写完全,懂的人自然懂 ,我也避免一些不必要的麻烦
如题:python 报错 提示为 : wxPyDeprecationWarning: Using deprecated class PySimpleApp. 解决:将 wx.PySimpleApp() 替换为 wx.App(False) 即可。 参考:http://stackoverflow.com/questions/15144168/error-using-deprecated-class-pysimpleapp-after-removing-epd
2020年10月