Linux环境thinkphp配置以及数据源驱动修改
项目中需要用到thinkphp,以下简称tp。
linux版本:64位CentOS 6.4
Nginx版本:nginx1.8.0
php版本:php5.5.28
thinkphp版:3.2.3
Linux环境Nginx安装与调试以及PHP安装
2.项目框架
tp源码下载http://www.thinkphp.cn/
最新文档http://www.kancloud.cn/manual/thinkphp/1682
下载框架后,解压缩到web目录下面,可以看到初始的目录结构如下:
1.www WEB部署目录(或者子目录)
2.├─index.php 入口文件
3.├─README.md README文件
4.├─Application 应用目录
5.├─Public 资源文件目录
6.└─ThinkPHP 框架目录
说明:需要修改网站根目录下的runtime目录权限
#chmod 777 ./Runtime/
根目录下index.php
if (version_compare(PHP_VERSION, '5.3.0', '<'))die('require PHP > 5.3.0 !');
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define('APP_DEBUG', TRUE);
/*** 缓存目录设置* 此目录必须可写,建议移动到非WEB目录*/
define('RUNTIME_PATH', './Runtime/');//定义公共模块的目录,放到应用目录外
define('COMMON_PATH', './Common/');//关闭目录安全文件的生成
define('BUILD_DIR_SECURE', false);// 定义应用目录
define('APP_PATH', './Application/');//define('BIND_MODULE','Admin');// 引入ThinkPHP入口文件
require './ThinkPHP/ThinkPHP.php';// 亲^_^ 后面不需要任何代码了 就是如此简单
修改Nginx配置
server {listen 81;server_name localhost;location / {index index.htm index.html index.php;#访问路径的文件不存在则重写URL转交给ThinkPHP处理if (!-e $request_filename) {rewrite ^/(.*)$ /index.php/$1 last;break;}}location ~ \.php/?.*$ {root /usr/wwwtp;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;#加载Nginx默认"服务器环境变量"配置include fastcgi.conf;#设置PATH_INFO并改写SCRIPT_FILENAME,SCRIPT_NAME服务器环境变量set $fastcgi_script_name2 $fastcgi_script_name;if ($fastcgi_script_name ~ "^(.+\.php)(/.+)$") {set $fastcgi_script_name2 $1;set $path_info $2;}fastcgi_param PATH_INFO $path_info;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name2;fastcgi_param SCRIPT_NAME $fastcgi_script_name2;}
}
在浏览器输入 http://localhost/index.php 预览首页
子页面本来是:
http://localhost/index.php/Home/school/select
经过URL重写以后是:
http://localhost/Home/school/select
如果需要去掉Home可以继续修改上面的重写规则:
rewrite ^/(.*)$ /index.php/Home/$1 last;
http://localhost/school/select
3.thinkphp的MVC结构
项目文件结构
如上图所示在Controller目录中新建一个SchoolController.class.php
在SchoolController.class.php新建一个index的方法
namespace Home\Controller;
use Think\Controller;
class SchoolController extends Controller {public function index(){echo "Hello Thinkphp!";}
}
在浏览器输入:http://192.168.0.104:81/home/school/index
4.数据库配置
参考官方文档:ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库驱动来处理。目前包含了Mysql、SqlServer、PgSQL、Sqlite、Oracle、Ibase、Mongo等数据库的支持,并且采用PDO方式。
如果是mysql就很简单按照官方的教程做就可以,如果是SQLserver或者其他数据库就会有些麻烦,需要稍稍做些修改。
另外关于linux环境PHP连接SQLserver可以参考此文:Linux环境PHP5.5以上连接SqlServer2008
首先需要改配置文件Common/conf/config.php,下面是sqlserver的配置:
return array(//'配置项'=>'配置值''DB_TYPE' => 'sqlsrv', // 数据库类型 'DB_USER' => 'unix21', // 用户名'DB_PWD' => '123456', // 密码'DB_PORT' => 1433, // 端口'DB_PREFIX' => '', // 数据库表前缀'DB_DSN' => 'dblib:host=XXX:1433;dbname=XXX', 'DB_CHARSET'=> 'utf8', // 字符集'DB_DEBUG' => TRUE, // 数据库调试模式 开启后可以记录SQL日志 3.2.3新增
);
public function account(){header("Content-type: text/html; charset=utf-8");dump(M('account')->select());}
注意:需要修改Sqlsrv.class.php中的代码,注释PDO::SQLSRV_ATTR_ENCODING => PDO::SQLSRV_ENCODING_UTF8,
文件位置如图所示:
不然会报错:
Undefined class constant 'PDO::SQLSRV_ATTR_ENCODING'
错误位置
FILE: /usr/wwwtp/ThinkPHP/Library/Think/Db.class.php LINE: 39
注释掉哪行代码以后可以正常显示:
此外,如果需要自己写sql可以这样:
header("Content-type: text/html; charset=utf-8");//dump(M('account')->select()); $Model = new \Think\Model();$result=$Model->query("select top 10 * from account;");dump($result);
其实thinkphp底层还是使用PDO连接数据库,可以自己修改Driver.class.php.
注释这一行
$this->linkID[$linkNum] = new PDO( $config['dsn'], $config['username'], $config['password'],$this->options);
改为硬编码就知道前面的配置还是在这里被使用:
$this->linkID[$linkNum] = new PDO( "dblib:host=192.168.1.235:1433;dbname=XXX","unix21","password",$this->options);
在浏览器一样显示出数据。
因为开发中总是会遇到一些特殊需求,所以,如果有需要就可以自己写一个底层的数据源驱动或者在tp的基础上做修改就可以了。
要想用好一个框架还是需要去读一读其源码,搞清楚其运行原理,达到为我所用,而不应该是用了几年框架都不知道底层怎么回事。
tp开启调试模式
配置文件增加代码
'SHOW_PAGE_TRACE' => TRUE,
thinkphp的坑
由于我们目前是tp+sqlserver所以估计使用的人不多,导致bug很少暴漏。
1).表名:
除了首字母以外中间的一律小写。
2).where条件:
必须按数据库里字段一样,例如数据库是ID那么你也要写ID,数据库是State你也要写State。
$map['State'] =2;
$map['ID'] = 5;
//数据库原表名是GJGZNews,如果你写为M('GJGZNews')那么会被TP变为G_J_G_Z_News
$news=M('gjgznews')->where($map)->select();
dump($news);
权限问题
_STORAGE_WRITE_ERROR_:./Runtime/Cache/Home/b39761fdd01eadcd4b8a82f371520558.php
├─Runtime 运行时目录
│ ├─Cache 模版缓存目录
│ ├─Data 数据目录
│ ├─Logs 日志目录
│ └─Temp 缓存目录
模版缓存目录Cache下的Home目录需要权限
# chmod 777 ./Home/
原因是$this->display('list');绑定模板就需要权限写目录生成缓存文件!
开启thinkPHP全站缓存
Think配置文件增加:
'DB_SQL_BUILD_CACHE' => true,
//开启静态缓存
'HTML_CACHE_ON' => true,
'HTML_CACHE_TIME' => 600, // 全局静态缓存有效期(秒)
'HTML_CACHE_RULES' => array(
'*'=>array('{$_SERVER.REQUEST_URI|md5}'),
需要给/Application/Html这个目录增加权限
# chmod -R 777 Html
原理是第一次请求生成html后在该目录生成一个个的html,再设定的时间内直接请求静态文件
-rw-r--r-- 1 nobody nobody 177460 Oct 1311:24 f6f0651ffb91f9bba1bb24ae0574d4f9.html
-rw-r--r-- 1 nobody nobody 162988 Oct 1311:29 f9f5ed1a3286dc39724e78dfeb3da4f4.html
-rw-r--r-- 1 nobody nobody 20109 Oct13 11:39 fcf7fa39e34d97c4dd219d7725e6d50f.html
-rw-r--r-- 1 nobody nobody 175251 Oct 1311:34 fdaa60f6d213dfca9069e6a520c755f9.html
官方文档:
http://document.thinkphp.cn/manual_3_2.html#html_cache
另外我还开启了 SQL解析缓存也是有用的,这个主要针对第一次
所以如果你的应用有大量的SQL查询需求,那么可以开启SQL解析缓存以减少SQL解析提高性能。要开启SQL解析缓存,只需要设置:
'DB_SQL_BUILD_CACHE'=>true,
相关文章:

《Linux内核设计与实现》读书笔记 第三章 进程管理
第三章进程管理 进程是Unix操作系统抽象概念中最基本的一种。我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在。 3.1进程 概念: 进程:处于执行期的程序。但不仅局限于程序,还包含其他资…

java持续集成soapui_集成testNG到JavaAPI测试-执行多条用例
*****************************************************************在这门课里你将学到Web Services(SOAP WebService和REST API)的手动测试及自动化测试,熟练使用Groovy脚本自动化测试WebService。这门课程设计的是从零基础入门开始学,然后以循序渐进…

python-os
os.listdir(path):path-->路径 返回类型为listos.getcwd() 获取当前工作目录os.chdir() 切换工作目录os.mkdir() 新建目录os.path.exists()os.path.isdir() os.path.join() 拼接字符串路径os.path.exists(rpath) 判断路径是否存在 r原始路径os.path.isdir() 判断是否是文件夹…
NetBeans配置Xdebug 远程调试PHP
很多PHP程序员使用echo,dump等比较原始的方法调试,这是非常落后的。几年前本人写过一篇: NetBeans配置Xdebug 由于那篇文档还需要引用本人写的其他文档,感觉有些分散,所以这里重新写一篇完整的。linux版本:…

java自定义上下文对象_Java框架_Spring应用上下文对象加载配置
我们都知道IOC是spring框架的核心,主要作用是控制反转,把我们需要的对象从容器中提供给我们,但是IOC是如何加载我们所需要的对象的?Spring容器是IOC容器的一种,它通过ApplicationContext接口将我们所需要的配置文件进行…

ThreadLocal源码分析
ThreadLocal的作用 Java对象是线程间共享的,但有时我们需要一些线程间隔离的对象,该对象只能由同一个线程读写,对其他线程不可见。ThreadLocal正式提供了这样的机制,详细使用方式请参考Java ThreadLocal。 ThreadLocal实现原理 自…

远程连接windows出现身份验证错误,提示由于CredSSP加密Oracle修正解决方案
本机操作系统(OS版本:10.0.17134) 远程计算机操作系统(OS版本:6.3.9600) 远程连接的时候报错“出现身份验证错误,要求的函数不受支持。远程计算机:xxx 这可能是由于CredSSP加密Oracle修正,若要了解详细信息...” 原因是系统更新安装了补丁&am…
MediaWiki安装
MediaWiki可以方便的让你搭建自己的wiki,公司内部使用非常方便官网: https://www.mediawiki.org/wiki/MediaWiki安装MediaWiki的必要环境 PHPMysql 下载最新版解压即可 # tar -xzvf mediawiki-1.25.2.tar.gz # mv mediawiki-1.25.2 wiki 输入首页引导一…

sql的四种连接 用mysql的语句写_170221、浅谈mysql的SQL的四种连接
例子:-------------------------------------------------a表 id name b表 id job parent_id1 张3 1 23 12 李四 2 34 23 王武 3 34 4a.id同parent_id 存在关…

MySQL冷备份的跨操作系统还原
数据来源:linux平台mysql版本为5.7 数据去向:windows平台mysql版本为5.7 操作步骤: 第一步:关闭mysql服务 service mysqld stop 第二步:归档linux平台下mysql的数据目录 tar -czvf data.tar.gz /usr/local/mysql/data …

Java 社区领袖联合发文:别慌,Java 仍然是免费的!
开发四年只会写业务代码,分布式高并发都不会还做程序员? >>> 在去年的 Java One 上,Mark Cavage 当时宣布 Oracle 将逐步开源 Oracle JDK 的专有功能(商业特性)。Oracle Java 平台产品管理高级总监 Donald …

Squid安装
最新版Squid安装 http://www.squid-cache.org/Versions/v3/3.5/# wget http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.7.tar.gz# tar zxvf squid-3.5.7.tar.gz# cd squid-3.5.7# ./configure --prefix/usr/local/squid# make && make install# chmod -R 777 /…

Java内部类手机专卖店_JAVA——内部类的那些事儿
obj3.func();//3.2 访问静态内部类的静态方法(通过类名访问)Outer.StaInner.staFunc();//4 局部内部类访问局部变量Outer obj4 new Outer();obj4.local();//5 匿名内部类Outer obj5 new Outer();obj5.anonymous();//6 匿名内部类作为参数asPara(new AbstractClass() {public …

Linux下Postfix的配置和使用
Postfix为何物,详见:http://zh.wikipedia.org/wiki/Postfix 0.关于Postfix postfix的产生是为了替代传统的sendmail.相较于sendmail,postfix在速度。性能和稳定性上都更胜一筹。如今眼下许多的主流邮件服务事实上都在採用postfix. 当我们须要一个轻量级的…
部分人说 Java 的性能已经达到甚至超过 C++,是真的吗?
好多Java程序员都说由于JIT技术的引入,Java的性能已经和C一样了,而且Java的开发效率极高,可以省下60%的时间。请问事实真的是这样吗?我平常也都在写这两个语言,但是因为开发的软件的复杂度不大,并没有感觉到…

Wiki 开源软件
Wiki 是一个协同著作平台或称开放编辑系统。所谓协同工作, 即它能够让浏览网页的人都能够去修订网页,其简介的 ... Wiki 是怎么做到的. Wiki 使用 了简化的语法,替代复杂的HTML,加上WEB 界面的编辑工具,降低内容维护的…
Android studio安装与调试
1.下载安装android studio 下载好之后安装好2.启动报错提示1)进入刚安装的Android Studio目录下的bin目录。找到idea.properties文件,用文本编辑器打开。2)在idea.properties文件末尾添加一行: disable.android.first.runtrue &am…

java的父类java.lang.object_根父类:java.lang.Object
1、根父类(1)Object类型是所有引用数据类型的超类,包括数组类型如果一个类没有显式的声明它的父类,那么它的父类就是Object。(2)Object类中的方法,会继承到所有类型的对象中,包括数组对象。即所有对象都可以调用Object类中声明的方…

spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient
在使用服务发现的时候提到了两种注解,一种为EnableDiscoveryClient,一种为EnableEurekaClient,用法上基本一致,今天就来讲下两者,下文是从stackoverflow上面找到的对这两者的解释:原文链接 There are multiple implementations of…

strust2自定义interceptor的基本方法及操作
需求:制作一个网站需要用户登陆后才能查看,即一个权限的问题 1.首先明确在用户没登陆前有两个Action请求是可以通过的,即注册和登陆。 2.创建拦截器,如UserLoginInterceptor.java,如下 public class UserLoginIntercep…
使用xdebug分析thinkphp框架函数调用图
开发中需要性能调优,使用xdebug分析thinkphp框架函数调用图。关于xdebug的安装参考这2篇 NetBeans配置Xdebug 远程调试PHP php扩展xdebug安装以及用kcachegrind系统分析1.安装xdebug 需要先去http://www.xdebug.org看看一些文档,xdebug作为php扩展安装 #…

java+script+当前日期_如何在JavaScript中获取当前日期?
如何在JavaScript中获取当前日期?#1楼您可以使用扩展了 Date对象的Date.js库,从而可以使用.today()方法。#2楼如果您想对日期格式进行更多的粒度控制,我强烈建议您查看一下momentjs。 很棒的图书馆-只有5KB。 http://momentjs.com/#3楼你可以…

java中的类修饰符、成员变量修饰符、方法修饰符。
类修饰符: public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类。 abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供…
Linux 系统挂载数据盘
Linux 系统挂载数据盘: 适用系统:Linux(Redhat , CentOS,Debian,Ubuntu)* Linux的云服务器数据盘未做分区和格式化,可以根据以下步骤进行分区以及格式化操作。下面的操作将会把数据盘划分为一个…

java 启动某个类_java – Spring Boot – 如何指定备用启动类? (多个入口点)
我想添加一个替代的入口点到我的Spring-Boot应用程序.我宁愿把它当成一个肥罐.这可能吗?根据他们的documentation,属性loader.main指定要启动的主类的名称.我尝试java -jar MyJar.jar –loader.main com.mycompany.AlternateMain,但是我的pom.xml中指定的start-cla…

WIN7 64位系统下,右下角的声音和电源图标不见的解决办法
近日,电脑突然出现任务栏右下角的声音和电源图标消失不见的问题,重启仍旧没有修复,后来找到了解决办法 解决办法: 1.CtrlShiftEsc键调出windows资源管理器。 2.找到进程中的explorer.exe进程并结束它。 3.在文件选项的新建任务选项…

创建Maven版Java工程
步骤: 创建成功后,如图: 转载于:https://www.cnblogs.com/zhzcode/p/9722902.html
Linux系统启动任务的写法
1.到/etc/rc.d目录# cd /etc/rc.d 2.修改rc.local # vim ./rc.local你之前是怎么启动nginx和php命令复制即可。例如:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf/etc/init.d/php-fpm3.一定要给权限 # chmod x rc.local特别是喜欢下载到本地修…

java ee不能运行_Java9+移除 Java EE,导致我的 groovy 脚本无法运行
以以下这段代码为例Grab(org.jsoup:jsoup:1.10.1)import org.jsoup.JsoupJsoup.connect(https://v2ex.com).get().select(span.item_title > a).each {println it.text() : https://v2ex.com it.attr(href)}原本是 groovy2.5java8,可以正常跑,然后…

虚拟文件系统(VFS)
原文链接:http://www.orlion.ga/1008/ linux在不同的文件系统之上做了一个抽象层,使得文件、目录、读写访问等概念都成为抽象层概念,这个抽象层被称为虚拟文件系统(VFS)。 linux内核的VFS子系统如下: 每个进程在PCB(Process Control Block)中…