LOFTER for ipad —— 让兴趣,更有趣

点击下载 关闭

php

10489浏览    2758参与
错误记录 Error log

阿里云ECS centos 6升级7

不要直接在系统内升级 

阿里云后台建快照 然后停机 重新把系统盘的操作系统换了 换成 7的版本

然后把快照挂载后把 数据迁移过来即可

挂载操作

https://help.aliyun.com/document_detail/199739.htm?spm=a2c4g.11186623.0.0.1183y4PTy4PTMc#task-2023818


不要直接在系统内升级 

阿里云后台建快照 然后停机 重新把系统盘的操作系统换了 换成 7的版本

然后把快照挂载后把 数据迁移过来即可

挂载操作

https://help.aliyun.com/document_detail/199739.htm?spm=a2c4g.11186623.0.0.1183y4PTy4PTMc#task-2023818


yangli-1128

PHP cURL error 77,证书路径错误

今天换了一台电脑调试PHP,在访问HTTPS的时候提示 cURL error 77,证书路径错误。我在其他电脑上都能正常运行,但在这台电脑上就是不行。通过BAIDU,说是证书路径错误,需要修改成完整路径。修改如下

-----------------------------------

修改php.ini

curl.cainfo ="cacert.pem"

修改成完整路径即可

curl.cainfo ="D:\\xampp\\php7.4.30\\php-7.4.30\\cacert.pem"

今天换了一台电脑调试PHP,在访问HTTPS的时候提示 cURL error 77,证书路径错误。我在其他电脑上都能正常运行,但在这台电脑上就是不行。通过BAIDU,说是证书路径错误,需要修改成完整路径。修改如下

-----------------------------------

修改php.ini

curl.cainfo ="cacert.pem"

修改成完整路径即可

curl.cainfo ="D:\\xampp\\php7.4.30\\php-7.4.30\\cacert.pem"

yangli-1128

php think6 win运行报错修改

错误提示:htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated

在文件 vendor/topthink/framework/src/think/Request.php

第1419行插入

if($value!=null)

---------------完整代码-------------------------

```

publicfunction filterValue(&$value, $key, $filters)...


错误提示:htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated

在文件 vendor/topthink/framework/src/think/Request.php

第1419行插入

if($value!=null)

---------------完整代码-------------------------

```

publicfunction filterValue(&$value, $key, $filters)

    {

        $default = array_pop($filters);

 

        foreach ($filters as $filter) {

            if (is_callable($filter)) {

                // 调用函数或者方法过滤

                if($value!=null)

                    $value = call_user_func($filter, $value);

            } elseif (is_scalar($value)) {

                if (is_string($filter) && false !== strpos($filter, '/')) {

                    // 正则过滤

                    if (!preg_match($filter, $value)) {

                        // 匹配不成功返回默认值

                        $value = $default;

                        break;

                    }

                } elseif (!empty($filter)) {

                    // filter函数不存在时, 则使用filter_var进行过滤

                    // filter为非整形值时, 调用filter_id取得过滤id

                    $value = filter_var($value, is_int($filter) ? $filter : filter_id($filter));

                    if (false === $value) {

                        $value = $default;

                        break;

                    }

                }

            }

        }

 

        return $value;

    }


```

adolfjap

php mysql Cannot assign requested address 异常问题

由于linux分配的客户端连接端口用尽, 无法建立socket连接所致,虽然socket正常关闭,但是端口不是立即释放, 而是处于TIME_WAIT状态, 默认等待60s后才释放。

查看linux支持的客户端连接端口范围, 也就是28232个端口

cat /proc/sys/net/ipv4/ip_local_port_range

32768 - 61000


调低端口释放后的等待时间, 默认为60s, 修改为15~30s

echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout......

由于linux分配的客户端连接端口用尽, 无法建立socket连接所致,虽然socket正常关闭,但是端口不是立即释放, 而是处于TIME_WAIT状态, 默认等待60s后才释放。

查看linux支持的客户端连接端口范围, 也就是28232个端口

cat /proc/sys/net/ipv4/ip_local_port_range

32768 - 61000


调低端口释放后的等待时间, 默认为60s, 修改为15~30s

echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout


修改tcp/ip协议配置, 通过配置/proc/sys/net/ipv4/tcp_tw_resue, 默认为0, 修改为1, 释放TIME_WAIT端口给新连接使用。

echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse


修改tcp/ip协议配置,快速回收socket资源, 默认为0, 修改为1

echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle




Tops博客

PHP Websocket 实现简易聊天系统


WebSocket是一个持久化的协议,举个简单的例子,http1.0的生命周期是以request作为界定的,也就是一个request,一个response,对于http来说,本次client与server的会话到此结束;而在http1.1中,稍微有所改进,即添加了keep-alive,也就是在一个http连接中可以进行多个request请求和多个response接受操作。然而在实时通信中,并没有多大的作用,http只能由client发起请求,server才能返回信息,即server不能主动向client推送信息,无法满足实时通信的要求。而WebSocket可以进行持久化连接,即client...

WebSocket是一个持久化的协议,举个简单的例子,http1.0的生命周期是以request作为界定的,也就是一个request,一个response,对于http来说,本次client与server的会话到此结束;而在http1.1中,稍微有所改进,即添加了keep-alive,也就是在一个http连接中可以进行多个request请求和多个response接受操作。然而在实时通信中,并没有多大的作用,http只能由client发起请求,server才能返回信息,即server不能主动向client推送信息,无法满足实时通信的要求。而WebSocket可以进行持久化连接,即client只需进行一次握手,成功后即可持续进行数据通信,值得关注的是WebSocket实现client与server之间全双工通信,即server端有数据更新时可以主动推送给client端。


演示地址 http://dev.topsts.cn/websocket.html

客户端实现(HTML5 JS)



<!DOCTYPE HTML>
<html>

<head>
<meta charset="utf-8">
<title>WebSocket Test</title>
<meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
<script type="text/javascript" src="http://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
if ("WebSocket" in window) {
console.log("您的浏览器支持 WebSocket!");
// 打开一个 web socket
var ws = new WebSocket("ws://dev.topsts.cn:9502");
console.log('连接状态:',ws);
// 打开连接
ws.onopen = function() {
$('#messages').append('WebSocket 连接成功 <br>');
};
// 接收到消息
ws.onmessage = function(evt) {
var received_msg = evt.data;
console.log('一个消息:',evt);
$('#messages').append(evt.data+'<br>');
};
// 出现错误
ws.onerror = function(err) {
console.warn('出现错误:',err);
alert("出现错误");
}
// 关闭 websocket
ws.onclose = function() {
console.log("连接已关闭...");
alert("连接已关闭...");
};
} else {
// 浏览器不支持 WebSocket
alert("您的浏览器不支持 WebSocket!");
}
// 发送消息
$('#send').click(function() {
var content = window.prompt('请输入内容', '默认内容');
ws.send(content);
});
// 关闭连接
$('#close').click(function() {
ws.close();
console.log("连接主动关闭");
});
});
</script>
</head>

<body>
<div id="main">
<p>本页面用于测试WebSocket,使用ws://dev.topsts.cn:9502</p>
<button id="send">发送数据</button>
<button id="close">关闭连接</button>
<p><br></p>
<div id="messages">稍等,正在连接ws://dev.topsts.cn:9502<br></div>
</div>
</body>

</html>


服务端实现 Swoole PHP



<?php
class WebsocketTest
{
public $server;
public $fds = []; // 存放fd的数组
public function __construct()
{
$this->server = new swoole_websocket_server("0.0.0.0", 9502);
$this->server->set([
// 'daemonize' => 1, // 设置后台运行
]);
// 打开链接
$this->server->on('open', function (swoole_websocket_server $server, $request) {
echo "server: handshake success with fd{$request->fd}\n";
// 收集链接用户
$this->fds[] = $request->fd;
$this->fds = array_unique($this->fds); // 去重
$this->server->push($request->fd, '系统:您的UID为' . $request->fd);
foreach ($this->fds as $value) {
$server->push($value, '广播:UID' . $request->fd . '用户已经上线');
}
});
// 接收数据
$this->server->on('message', function (swoole_websocket_server $server, $frame) {
echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
foreach ($this->fds as $value) {
$this->server->push($value, '发送:(UID' . $frame->fd . ')' . $frame->data);
}
});
// 关闭链接
$this->server->on('close', function ($ser, $fd) {
echo "client {$fd} closed\n";
// 找到并删除元素
array_splice($this->fds, array_search($fd, $this->fds), 1);
foreach ($this->fds as $value) {
$this->server->push($value, '系统:UID' . $fd . '已经下线');
}
});
// 当做HTTP服务使用
$this->server->on('request', function ($request, $response) {
// 接收http请求从get获取message参数的值,给用户推送
// $this->server->connections 遍历所有websocket连接用户的fd,给所有用户推送
foreach ($this->server->connections as $fd) {
$this->server->push($fd, $request->get['message']);
}
});
$this->server->start();
}
}
new WebsocketTest();



启动

php index.php


即可
Tops博客

PHP7连接微软 SQL Server (MSSQL)


我们以 32位PHP7 和 SQL Server 2012 (面板版) 作为示例演示,其他版本方法类似
文章中所有连接均为微软官方下载


安装 SQL Server 2012



https://www.microsoft.com/zh-cn/download/details.aspx?id=56042


  • SP4 是目前2012最新的一个版本,发布与 2017.10

  • 下载 Express 版本的 SQLEXPRADV_x64_CHS.exe

  • Express 是可以免费商业使用的,对于我们来说足够用了

  • SQLEXPRADV...

我们以 32位PHP7 和 SQL Server 2012 (面板版) 作为示例演示,其他版本方法类似
文章中所有连接均为微软官方下载


安装 SQL Server 2012



https://www.microsoft.com/zh-cn/download/details.aspx?id=56042


  • SP4 是目前2012最新的一个版本,发布与 2017.10

  • 下载 Express 版本的 SQLEXPRADV_x64_CHS.exe

  • Express 是可以免费商业使用的,对于我们来说足够用了

  • SQLEXPRADV 是一个完整包,包含所有的工具,如 SSMS




各版本说明

LocalDB (SqlLocalDB)是 Express的一种轻型版本,该版本具备所有可编程性功能,但在用户模式下运行,并且具有快速的零配置安装和必备组件要求较少的特点。
Express (SQLEXPR) 版本仅包含 SQLServer 数据库引擎。它最适合需要接受远程连接或以远程方式进行管理的情况。

Express with Tools (SQLEXPRWT) 此包包含将 SQL Server 作为数据库服务器进行安装和配置所需的全部内容,包括SSMS的完整版本。

SQL Server Management Studio Express (SQLManagementStudio) 此版本不包含数据库,只包含用于管理 SQL Server 实例的工具的完整版本(简称SSMS)。

Express with Advanced Services (SQLEXPRADV) 此包包含 SQL Server Express 的所有组件,包括SSMS的完整版本。



  1. 安装时勾选全部工具

  2. 安装时,在数据库引擎配置阶段,选择使用SQL Server身份认证(需要输入密码),而非Windows身份认证



"必须重新启动计算机才能安装 SQL Server"的问题解决




  1. 重启机器,再进行安装,如果发现还有该错误,请按下面步骤

  2. 在开始->运行中输入regedit

  3. 到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession Manager 位置

  4. 在右边窗口右击PendingFileRenameOperations,选择删除,然后确认

  5. 重启安装,问题解决



安装 ODBC 工具



https://www.microsoft.com/zh-cn/download/details.aspx?id=36434


  • 此为 Microsoft® ODBC Driver 11 for SQL Server 适用于 SQL Server 2012 , 其他版本具体Google



安装时勾选全部工具

安装PHP PDO SQLSRV 拓展



https://www.microsoft.com/en-us/download/details.aspx?id=20098


  • Version 4.0 supports PHP 7.0+ on Windows and Linux

  • Version 3.2 supports PHP 5.6, 5.5, and 5.4 on Windows

  • Version 3.1 supports PHP 5.5 and 5.4 on Windows

  • Version 3.0 supports PHP 5.4 on Windows



本文是 php7.0 , 所以下载 SQLSRV40.EXE

安装时需要选择PHP目录,需要选择PHP程序根目录\ext 文件夹。
软件会生成 php_pdo_sqlsrv_7_ .dll 4个 和 php_sqlsrv_7_.dll 4个,共8个文件。
由于我们使用的是nts连接,且 PHP版本是32位的,因此将以下内容插入到php.ini 中 extension=*.dll下方

extension=php_pdo_sqlsrv_7_nts_x86.dll
extension=php_sqlsrv_7_nts_x86.dll



版本x64和x86 选择和你的PHP版本有关,和系统版本、数据库版本无关!


重启 Apache/Nginx 和 PHP

测试是否安装好



通过PHPinfo来查看,查找 有没有 pdo_sqlsrv 拓展,如果有说明配置成功

<?php
phpinfo();
?>


使用PHP测试SQLServer连接



<?php
try {
$dbh = new PDO("sqlsrv:Server=192.168.1.110,1433;Database=数据库名", "sa", "数据库密码");
} catch (PDOException $e) {
echo "Failed to get DB handle: " . $e->getMessage() . "n";
exit;
}
echo 'connent MSSQL succeed';

$stmt = $dbh->prepare("select * from users");
$stmt->execute();

while ($row = $stmt->fetch()) {
print_r($row);
}


如果出现 connent MSSQL succeed 说明已经连接成功了,但是很多时候会出现 由于目标计算机积极拒绝 ……

由于目标计算机积极拒绝 的解决方法



在开始菜单,打开“SQL配置管理器”,找到左侧 “SQL Server 网络配置”->“MSSQLSERVER的协议”, 把 Named Pipes 、 TCP/IP 右击启用

此次会提示重启 SQL Server 服务即可,但是实际情况好像不管用,建议直接 重启电脑


SQL Server 可能会占用80端口,同样需要在“SQL配置管理器”中先将SQL服务停止,再启动Apache/Nginx,然后在启动SQL


ThinkPHP设置(以3.2.3版本)



'DB_TYPE' => 'sqlsrv', // 数据库类型
'DB_HOST' => '192.168.1.110', // 服务器地址
'DB_NAME' => 'lingyun', // 数据库名
'DB_USER' => 'sa', // 用户名
'DB_PWD' => 'lingyun', // 密码
'DB_PORT' => '1433', // 端口
'DB_PREFIX' => 'ly_', // 数据库表前缀


然后可以使用M函数或者D函数测试一下
Tops博客

ThinkPHP 3 笔记 模板

修改左右定界符
休要修改配置文件中的配置项
'TMPL_L_DELIM'=>'<{', //修改左定界符
'TMPL_R_DELIM'=>'}>', //修改右定界符
模板中的赋值
$this->assign('name','ZYH');
$this->name='ZYH2';
$this->display();
模板的使用

模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[index].html(.tpl)
更换模板文件的后缀名(修改配置文件)
'TMPL_TEMPLATE_SUFFIX'=...

修改左右定界符
休要修改配置文件中的配置项
'TMPL_L_DELIM'=>'<{', //修改左定界符
'TMPL_R_DELIM'=>'}>', //修改右定界符
模板中的赋值
$this->assign('name','ZYH');
$this->name='ZYH2';
$this->display();
模板的使用

模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[index].html(.tpl)
更换模板文件的后缀名(修改配置文件)
'TMPL_TEMPLATE_SUFFIX'=>'.html',//更改模板文件后缀名
修改模板文件目录层次
'TMPL_FILE_DEPR'=>'_',//修改模板文件目录层次
模板主题
'DEFAULT_THEME'=>'your',//设置默认模板主题
需要在TPL下面新建一个your文件夹作为模板主题文件夹
如何动态修改模板主题?
1、在后台准备一个功能,修改config.php文件中的默认模板项
2、通过url传递 t=主题 参数可以修改不同的模板
'DEFAULT_THEME'=>'your',//设置默认模板主题
'TMPL_DETECT_THEME'=>true,//自动侦测模板主题
'THEME_LIST'=>'your,my',//支持的模板主题列表

输出模板内容
a、display
1.display中没有参数
$this->display();
2.可以带参数
本模块文件夹下的其他模板文件 $this->display('index2');
其他文件夹下的模板文件 $this->display('Public:error');
注意,仅仅需要在Tpl下有Public文件夹以及其中的error.html即可,不需要一定有Public模块
其他主题下的:文件夹下的:模板文件
需要开启主题支持 $this->display('my:Index:index');
一个url路径 $this->display('./Public/error.html');
$this->display('./Public/error.html','utf-8','text/xml');
$this->show($content);
3.fetch方法
获得模板文件中的内容,以字符串形式返回
$content=$this->fetch('Public:error');
4.show方法
不需要模板文件,可以直接输出模板内容
$content=$this->fetch('Public:error');
dump($content);
$content=str_replace('h1','i',$content);(替换)
$this->show($content);

模板替换

PUBLIC:会被替换成当前网站的公共目录 通常是 /Public/
ROOT: 会替换成当前网站的地址(不含域名)
APP: 会替换成当前项目的URL地址 (不含域名)
GROUP:会替换成当前分组的URL地址 (不含域名)
URL: 会替换成当前模块的URL地址(不含域名)
ACTION:会替换成当前操作的URL地址 (不含域名)
SELF: 会替换成当前的页面URL
更换模板变量规则,修改配置项
'TMPL_PARSE_STRING'=>array( //添加自己的模板变量规则
'CSS'=>ROOT.'/Public/Css',
'JS'=>ROOT.'/Public/Js',
),
模板中的变量
一、变量输出

1.标量输出 {$name}
2.数组输出 {$name[1]} {$name['k2']} {$name.k1}
3.对象输出 {$name:k} {$name->k}
二、系统变量 {$Think.get.id}
三、使用函数 {$namestrtoupper} 生成的编译后文件是
四、默认值 {$namedefault='这里是默认值'}
五、运算符 + - * / % ++ -- eg.{$name++}
标签使用
导入CSS和JS文件

1、css link js scr


2.import
//导入Public/Js/test.js文件,可以省略type属性,默认就是js的

//可以更改默认文件夹 设置basepath属性

3.load
//方法可以自动检测导入的文件类型

模板中的基本语法
分支结构 ( > gt < lt == eq <= elt >= egt != neq === heq !== nheq )
1.
未成年

青春年少

成年

2.
一个和尚挑水吃
两个和尚台水吃
这里是默认值

循环结构
1.for



{$j}abc



2.volist
<volist name='list' id='v'>
{$v.username}<br/>
</volist>
3.foreach
<foreach name='list' item='v' key='k'>
{$k}-------{$v}<br/>
</foreach>


特殊标签
1、比较标签
eq或者 equal 等于 neq 或者 notequal 不等于 gt 大于 egt 大于等于 lt 小于 elt 小于等于 heq 恒等于 nheq 不恒等于
2.范围标签
in

在这些数字里面不在这些数字的范围内
在这些数字里面不在这些数字的范围内
between
{$n}在1-10之间{$n}不在1到10之间
3.present
标签来判断模板变量是否已经赋值,
m有赋值m没有赋值
4.Empty
empty标签判断模板变量是否为空,
n为空赋值n有值
5.Defined
判断常量是否已经定义
6.Define
在模板中定义常量
7.Assing
模板中变量赋值
在模板中直接使用PHP代码
echo "我是赵桐正"
模板包含







在模板中变量用[变量]接受

模板渲染
1、自动开启模板渲染 设置配置文件
'LAYOUT_ON'=>true,//开启模板渲染
准备一个模板渲染页面,在页面中使用{ CONTENT}接受具体模板页面的内容
如果在摸一个具体模板中不希望使用渲染模板,可以在页首添加{ NOCONTENT}
2、不开启自动模板渲染可以在每一个具体页面的页首添加

3.使用技巧
在渲染模板文件中也可以使用其他模板文件的内容


这里是渲染页面!!!
{CONTENT}


Tops博客

Unable to find the wrapper https错误的解决办法

PHP.ini默认配置下,用file_get_contents读取https的链接,就会如下错误:

Warning: fopen() [function.fopen]: Unable to find the wrapper "https" - did you forget to enable it when you configured PHP?

这个错误分3种解决方案:
1. windows下的PHP,只需要到php.ini中把extension=php_openssl.dll前面的;删掉,重启服务就可以了。
2. linux下的PHP,就必须安装openssl...

PHP.ini默认配置下,用file_get_contents读取https的链接,就会如下错误:

Warning: fopen() [function.fopen]: Unable to find the wrapper "https" - did you forget to enable it when you configured PHP?


这个错误分3种解决方案:
1. windows下的PHP,只需要到php.ini中把extension=php_openssl.dll前面的;删掉,重启服务就可以了。
2. linux下的PHP,就必须安装openssl模块,安装好了以后就可以访问了。
3. 如果服务器你不能修改配置的话,那么就使用curl函数来替代file_get_contents函数,当然不是简单的替换啊。还有相应的参数配置才能正常使用curl函数。
Tops博客

ThinkPHP 3 笔记 CURD

ThinkPHP CURD特性

C
$m=new Model('User');
$m=M('User');
$m->字段名=值
$m->add();
返回值是新增的id号
U
$m=M('User');
$data['id']=1;
$data['username']='ztz2';
$m->save($data);
返回值是受影响行数
D
$m=M('User');
$m->delete(2); //删除id为2的数据
$m->where('id=2')->delete(); //与上面效果相同,也是删除id为2的数据,返回值是受影响行数
R
$m=new Model...

ThinkPHP CURD特性

C
$m=new Model('User');
$m=M('User');
$m->字段名=值
$m->add();
返回值是新增的id号
U
$m=M('User');
$data['id']=1;
$data['username']='ztz2';
$m->save($data);
返回值是受影响行数
D
$m=M('User');
$m->delete(2); //删除id为2的数据
$m->where('id=2')->delete(); //与上面效果相同,也是删除id为2的数据,返回值是受影响行数
R
$m=new Model('User');
$m=M('User');
select
$m->select();//获取所有数据,以数组形式返回
find
$m->find($id);//获取单条数据
getField(字段名)//获取一个具体的字段值
$arr=$m->where('id=2')->getField('username');
Count 获取个数
$m=M('User');
$date['username']='abc';
$c=$m->where($date)->count();
max //获取最大数
min //获取最小数
avg //获取平均数
sum //获取总和

连贯操作

1.where 帮助我们设置查询条件
2.order 对结果进行排序
$arr=$m->order('id desc')->select();
$arr=$m->order(array('id'=>'desc','sex'=>'asc'))->select();
3.limit 限制结果
limit(2,5)
limit('2,5')
limit(10)//limit(0,10)
4.field 设置查询字段
field('username as name,id')
field(array('username'=>'name','id')
field('id',true) //获取除了id以外的所有字段
5.table

6.group

7.having

补充
alias 用于给当前数据表定义别名 字符串
page 用于查询分页(内部会转换成limit) 字符串和数字
join* 用于对查询的join支持 字符串和数组
union* 用于对查询的union支持 字符串、数组和对象
distinct 用于查询的distinct支持 布尔值
lock 用于数据库的锁机制 布尔值
cache 用于查询缓存 支持多个参数(以后在缓存部分再详细描述)
relation 用于关联查询(需要关联模型扩展支持) 字符串
validate 用于数据自动验证 数组
auto 用于数据自动完成 数组
filter 用于数据过滤 字符串
scope* 用于命名范围 字符串、数组

==================数据库设置====================

'DB_TYPE'=>'mysql', //设置数据库类型
'DB_HOST'=>'localhost',//设置主机
'DB_NAME'=>'thinkphp',//设置数据库名
'DB_USER'=>'root', //设置用户名
'DB_PWD'=>'', //设置密码
'DB_PORT'=>'3306', //设置端口号
'DB_PREFIX'=>'tp_', //设置表前缀


也可以使用DSN方法进行配置

'DB_DSN'=>'mysql://root:@localhost:3306/thinkphp', *如果两种方式同时存在,以DSN方式为优先


查询方式

普通查询方式
a、字符串
$arr=$m->where("sex=0 and username='abc'")->find();
b、数组
$data['sex']=0;
$data['username']='abc';
$arr=$m->where($data)->find();
注意:这种方式默认是and的关系,如果使用or关系,需要添加数组值
$data['sex']=0;
$data['username']='gege';
$data['_logic']='or';

表达式查询方式
EQ 等于
$data['id']=array('eq',6);
$arr=$m->where($data)->select();
NEQ 不等于
GT 大于
EGT 大于等于
LT 小于
ELT 小于等于
LIKE 模糊查询
$data['username']=array('like','%ge');
$arr=$m->where($data)->select();
NOTLIKE (notlike中间没有空格)
$data['username']=array('notlike','%ge%');
$arr=$m->where($data)->select();
注意:如果一个字段要匹配多个通配符
$data['username']=array('like',array('%ge%','%2%','%五%'),'and');//如果没有第三个值,默认关系是or关系
$arr=$m->where($data)->select();
BETWEEN

$data['id']=array('between',array(5,7));
$arr=$m->where($data)->select();
//SELECT * FROM tp_user WHERE ((id BETWEEN 5 AND 7 ) )
$data['id']=array('not between',array(5,7));//注意,not 和 between中间一定要有空格
$arr=$m->where($data)->select();
IN

$data['id']=array('in',array(4,6,7));
$arr=$m->where($data)->select();
//SELECT * FROM tp_user WHERE ( id IN (4,6,7) )
$data['id']=array('not in',array(4,6,7));
$arr=$m->where($data)->select();
//SELECT * FROM tp_user WHERE ( id NOT IN (4,6,7) )

区间查询
$data['id']=array(array('gt',4),array('lt',10));//默认关系是 and 的关系
//SELECT * FROM tp_user WHERE ( (id > 4) AND (id < 10) )
$data['id']=array(array('gt',4),array('lt',10),'or') //关系就是or的关系
$data['name']=array(array('like','%2%'),array('like','%五%'),'gege','or');

直接查询
a、query 主要数处理读取数据的
成功返回数据的结果集
失败返回boolean false
$m=M();
$result=$m->query("select * from t_user where id >50");
var_dump($result);
b、execute 用于更新个写入操作
成功返回影响行数
失败返回boolean false
$m=M();
$result=$m->execute("insert into t_user(username) values('ztz3')");
var_dump($result);
Tops博客

PHP CLI 报错Cannot adopt OID in ……

在CLI(命令行)模式下运行PHP有时候会跳出一大堆错误,如:

Cannot adopt OID in UCD-SNMP-MIB
Cannot adopt OID in LM-SENSORS-MIB: lmTempSensorsValue

安装两个软件就行:

他们分别是:getcomposer和snmp-mibs-downloader

下载:curl -sS https://getcomposer.org/installer php
安装:/usr/bin/php composer.phar --version
环境变量:mv composer.phar /usr/local...

在CLI(命令行)模式下运行PHP有时候会跳出一大堆错误,如:

Cannot adopt OID in UCD-SNMP-MIB
Cannot adopt OID in LM-SENSORS-MIB: lmTempSensorsValue


安装两个软件就行:

他们分别是:getcomposer和snmp-mibs-downloader

下载:curl -sS https://getcomposer.org/installer php
安装:/usr/bin/php composer.phar --version
环境变量:mv composer.phar /usr/local/bin/composer
apt-get install snmp-mibs-downloader
Tops博客

ThinkPHP 3 笔记 控制器 模型使用

ThinkPHP 3 MVC模式和URL访问
什么是MVC
M -Model 编写model类 对数据进行操作 /Lib/Model
V -View 编写html文件,页面呈现 /Tpl
C -Controller 编写类文件(UserAction.class.php)/Lib/Action
开启调试
1. 开启调试功能
define('APP_DEBUG',true);
2.我们需要设置配置文件,开启页面trace
'SHOW_PAGE_TRACE'=>true,//开启页面Trace
url的4种访问方式

1.PATHINFO 模式 http://域名/项目名/入口文件/模块名/方法名/键...

ThinkPHP 3 MVC模式和URL访问
什么是MVC
M -Model 编写model类 对数据进行操作 /Lib/Model
V -View 编写html文件,页面呈现 /Tpl
C -Controller 编写类文件(UserAction.class.php)/Lib/Action
开启调试
1. 开启调试功能
define('APP_DEBUG',true);
2.我们需要设置配置文件,开启页面trace
'SHOW_PAGE_TRACE'=>true,//开启页面Trace
url的4种访问方式

1.PATHINFO 模式 http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值2
2.普通模式 http://域名/项目名/入口文件?m=模块名&a=方法名&键1=值1&键2=值2
3.REWRITE模式 http://域名/项目名/模块名/方法名/键1/值1/键2/值2
4.兼容模式 http://域名/项目名/入口文件?s=模块名/方法名/键1/值1/键2/值2
控制器的模块和操作
空操作
function _empty($name){
$this->show("$name 不存在 返回首页");
}
空模块
class EmptyAction extends Action{
function index(){
}
}

前置操作和后置操作 initialize
1、前置操作: _before
操作名
2、后置操作: after操作名

URL
一、URL规则
1、默认是区分大小写的
2、如果我们不想区分大小写可以改配置文件
'URL_CASE_INSENSITIVE'=>true,//url不区分大小写

3、如果模块名为 UserGroupAction
那么url找模块就必要要写成
http://localhost/thinkphp4/index.php/user_group/index
4、如果'URL_CASE_INSENSITIVE'=>false
那么url也可以写为
http://localhost/thinkphp4/index.php/UserGroup/index
二、URL伪静态
'URL_HTML_SUFFIX'=>'htmlshtmlxml',//限制伪静态的后缀
三、URL路由
1、启动路由
要在配置文件中开启路由支持
2、使用路由
1.规则表达式配置路由
'my'=>'Index/index',//静态地址路由
':id/:num'=>'Index/index',//动态地址路由
'year/:year/:month/:date'=>'Index/index',//动态和静态混合地址路由
'year/:year\d/:month\d/:date\d'=>'Index/index',//动态和静态混合地址路由
加上 \d代表类型只能是数字
'my/:id$'=>'Index/index',// 加上$说明地址中只能是 my/1000 后面不能有其他内容了
2.正则表达式配置路由
'/^year\/(\d{4})\/(\d{2})\/(\d{2})/'=>'Index/index?year=:1&month=:2&date=:3'
3、注意事项:
1.越复杂的路由越往前面放
'URL_ROUTE_RULES'=>array(
'my/:year/:month:/:day'=>'Index/day',
'my/:id\d'=>'Index/index',
'my/:name'=>'Index/index',
)
2.可以使用$作为完全匹配的路由规则
'URL_ROUTE_RULES'=>array(
'my/:id\d$'=>'Index/index',
'my/:name$'=>'Index/index',
'my/:year/:month:/:day$'=>'Index/day',
),
3.用正则匹配的方式
'URL_ROUTE_RULES'=>array(
'/^my\/(\d+)$/'=>'Index/index?id=:1',
'/^my\/(\w+)$/'=>'Index/index?name=:1',
'/^my\/(\d{4})\/(\d{2})\/(\d{2})$/'=>'Index/day?year=:1&month=:2&day=:3',
),

四、URL重写
五、URL生成

页面跳转
$this->success('查询成功',U('User/test'));
$this->redirect('User/test','',5,'页面正在跳');

toice
yangli-1128

wsl 安装 php 运行think6

0.wsl安装

1.php安装

sudo apt  install -y php php-mysql php-gd php-mbstring php-xml php-curl php-xdebug

2.composer安装

curl -sS https://getcomposer.org/installer | php

mv composer.phar /usr/bin/composer

composer self-update

3.进入项目目录

composer update

如果提示差PHP插件,根据提示安装:apt  install -y php-zip...

0.wsl安装

1.php安装

sudo apt  install -y php php-mysql php-gd php-mbstring php-xml php-curl php-xdebug

2.composer安装

curl -sS https://getcomposer.org/installer | php

mv composer.phar /usr/bin/composer

composer self-update

3.进入项目目录

composer update

如果提示差PHP插件,根据提示安装:apt  install -y php-zip

-----------------------debian 9 安装php7.4------------------------

sudo apt update

sudo apt -y install lsb-release apt-transport-https ca-certificates wget

sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg

echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list


sudo apt update

sudo apt install php7.4

安装插件:apt  install -y php7.4-{mysql,gd,mbstring,xml,curl,zip} 

CDNCLOUD_刘丽君
爬虫

2022年信息平台建设之旅(二)平台配置

Apache配置(D:\Apache2.4)

  1. 打开d:\Apache2.4\bin\httpd.conf,修改如下

  • #重定义Apache文件夹

          DEFINESVRROOT “D:/Apache2.4”

  • #修改监听端口,避免冲突

          Listen 8080

  •  #加载PHP模块...


Apache配置(D:\Apache2.4)

  1. 打开d:\Apache2.4\bin\httpd.conf,修改如下

  • #重定义Apache文件夹

          DEFINESVRROOT “D:/Apache2.4”

  • #修改监听端口,避免冲突

          Listen 8080

  •  #加载PHP模块

          LoadModule php_module D:/PHP8.1.0/php8apache2_4.dll

          PHPIniDir “D:/PHP8.1.0”

  • #添加PHP文件类型,在AddType处

          AddType application/x-httpd-php .php .html .htm

  • #添加缺省主页,非必须

         <IfModule dir_module>

             DirectoryIndex index.html index.php index.htm

         </IfModule>

Nginx配置(D:\Nginx1.21.4)

  1. 打开d:\Nginx1.21.4\conf\nginx.conf,修改如下:

  • #定义监听端口,避免冲突

          http{

              server{

                  listen 80

           #定义网页目录(以后访问的首页索引目录)

                 Location/{

                     rootd:/webServer/webDOCs;

配置mySQL

在mySQL目录下新建配置文件,命名为my.ini,编辑基本信息如下

[mysqld]

port = 3306

basedir="XXX"(XXX为mySQL的安装目录)

max_connections=50

character-set-server=utf8mb4

default-storage-engine=INNODB

 [mysql]

default-character-set=utf8mb4

[client]

port=3306

设置环境变量:我的电脑->属性->高级系统设置->环境变量->系统变量->path->编辑->新建,输入mySQL安装的目录,确定 

配置PHP

将D:\PHP810\ php.ini-development复制并更名为php.ini,用记事本或者其他文本编辑器打开,修改如下:

#on windows下extension目录

extension_dir = "d:/PHP810/ext"

#激活MySQL模块

extension=mysqli

extension=pdo_mysql





zsl_0529

10年经验也会遇到的PHP坑

    从10年开始到现在也有10年的PHP经验了,作为算是资深的phper日常codeing会注意代码的可读性、格式、逻辑的严谨,但是今天还是被世界上最好的语言PHP坑到了!!!

    背景:一个业务需求,获取客户的信息数据,一个客户可以有多个下属组织

    场景:有一个接口传参,参数在初期全部为int型,后期可能传字符串

    代码:

$channel = $_POST['channel'] ...

    从10年开始到现在也有10年的PHP经验了,作为算是资深的phper日常codeing会注意代码的可读性、格式、逻辑的严谨,但是今天还是被世界上最好的语言PHP坑到了!!!

    背景:一个业务需求,获取客户的信息数据,一个客户可以有多个下属组织

    场景:有一个接口传参,参数在初期全部为int型,后期可能传字符串

    代码:

$channel = $_POST['channel'] ? $_POST['channel'] : 0;

if ($channel == 1111) {

    echo"get 1111 info list";

} elseif ($channel == 222) {

    echo"get 222 info list";

} elseif ($channel == 'channel') {

    echo"get channel info list";

} else {

    echo"do default";

}

正常情况下传入1111、222、channel都没问题,但如果不传值那么就有问题了,参数的默认值为0,在$channel = 0的情况下代码判断$channel == 'channel'的时候PHP自动把字符串转换成了数字,翻译之后就是 0 == 0 ,大写的尴尬,心中万马奔腾!!!

一直认为PHP的自动转译是他的优势,不曾想也有马有失蹄的时候;

出现这个问题我暗自发誓,以后能用===绝不用==

然后自己测试了下switch,发现switch实现也是两个等号

$channel = $_POST['channel'] ? $_POST['channel'] : 0;

switch($channel){

    case1111:

        echo"get 1111 info list";

        break;

    case'channel':

        echo"get channel info list";

        break;

    case222:

        echo"get 222 info list";

        break;

    default:

        echo'default1';

        break;

}

神奇的PHP弱类型一直是他的优势,但在某些情况下也成了它的劣势!!!




京豆豆

sublime text3中支持PHP的方法

第一步:
1.下载php程序,下载地址:https://dou1314.lanzoui.com/iWSiYw1vefi

2.把php程序的目录添加到环境变量

第二步:

依次点击: Tools -> Build System -> New Build System

内容默认为:

{"shell_cmd": "make"}

修改为:

{    

"cmd": ["php", "$file"], ...

第一步:
1.下载php程序,下载地址:https://dou1314.lanzoui.com/iWSiYw1vefi

2.把php程序的目录添加到环境变量

第二步:

依次点击: Tools -> Build System -> New Build System

内容默认为:

{"shell_cmd": "make"}

修改为:

{    

"cmd": ["php", "$file"],    

"file_regex": "php$",    

"selector":"source.php"

}

然后Ctrl+S保存,不用修改保存路径,名字改为php.sublime-build


第三步:安装phpfmt

安装方法:CTRL+SHIFT+P 安装 phpfmt

配置路径


全部替换如下代码

{

"format_on_save":false,

"php_bin":"E:/GreenApp/php/php-7.0.9/php.exe",

"psr1":true,"psr1_naming":true,

"psr2":true,

"version":1

}

在你打开的php代码页面,按下快捷键Ctrl+B,此时sublime编辑器会显示代码运行结果.



最后一步:重启Sublime


参考文章:

php官网下载:https://www.php.net/downloads

PHP添加到环境变量:https://blog.csdn.net/weixin_43928774/article/details/104147988

phpfmt安装方法及配置:https://www.freesion.com/article/6941815895/

adolfjap

php 多进程

class vote extends Thread {


    public $content_id  = 0;

    public $runing = false;

    public $isFinished = false;

    public $writer;

    public function __construct($content_id,$writer) {...


class vote extends Thread {


    public $content_id  = 0;

    public $runing = false;

    public $isFinished = false;

    public $writer;

    public function __construct($content_id,$writer) {


        

        $this->runing = true;

        $this->content_id = $content_id;

        $this->writer = $writer;

    }


    public function run() 

    {

          // while ($this->runing) {


          //     if ($this->param != 0) {

          //         $nt          = rand(1, 10);

          //         echo "线程[{$this->name}]收到任务参数::{$this->param},需要{$nt}秒处理数据.\n";

          //         $this->res   = rand(100, 999);

          //         sleep($nt);

          //         $this->lurl = $this->param;

          //         $this->param   = '';

          //     } else {fdsdfsdfdsf

          //         echo "线程[{$this->name}]等待任务..\n";

          //     }

          //     sleep(1);

          // }

          echo "start ".$this->content_id."\n";

          $contentOrm = new \orm\mfk\content();

          $contentOrm->table_name = "content";

          $content = $contentOrm->get_one("id=".$this->content_id);

          $data = array();

          $data[] = $content['id'];

          $data[] = $content['title'];

          fputcsv($this->writer,$data);

          $this->isFinished = true;

           echo "end ".$this->content_id."\n";


    }


}

$pool = array();

// //这里创建线程池.

// $pool[] = new vote('a');

// $pool[] = new vote('b');

// $pool[] = new vote('c');


// //启动所有线程,使其处于工作状态

// foreach ($pool as $w) {

//     $w->start();

// }

$maxId = 0;

$writer = fopen("a.csv","w");

while(true)

{

  $contentOrm = new \orm\mfk\content();

  $contentOrm->table_name = "content";

  $where = "status=0 and process_date=1633575532 and doctor_id=4372";

  if($maxId)

  {

    $where.=" and id>".$maxId;

  }

  echo $where."\n";

  $list = $contentOrm->select($where,"id",5,"id asc");

  if(!$list)

  {

    break;

  }


  foreach($list as $row)

  {

    $maxId = $row['id'];

    while(true)

    {

      foreach ($pool as $key => $threads) 

      {

          if($threads['isFinished'])

          {

            unset($pool[$key]);

          }

      }

      if(count($pool)>=5)

      {

        continue;

      }

      $vote = new vote($row['id'],$writer);

      $vote->start();

      $pool[] = $vote;

      break;

    }

   

  }

}

while(true)

{

  $isWorking = false;

    foreach ($pool as $key => $threads) 

      {

          if(!$threads['isFinished'])

          {

            $isWorking = true;

            continue;

          }

      }

    if(!$isWorking)

    {

      break;

    }

}



fclose($writer);

exit;


adolfjap

正则替换连续字符

$jsonContent = preg_replace ( "/\s(?=\s)/","\\1", $jsonContent )

$jsonContent = preg_replace ( "/\s(?=\s)/","\\1", $jsonContent )

LOFTER

让兴趣,更有趣

简单随性的记录
丰富多彩的内容
让生活更加充实

下载移动端
关注最新消息