使用git log怎么退出

在使用 git log 命令查看提交历史时,如果你想退出查看,有几种方法可以做到:

  1. 使用 q 键:
    在大多数的 git log 输出中,你可以通过按 q 键来退出查看。这是最直接的方法,适用于大多数终端和 Git 版本。bashCopy Codegit log # 然后按 q 退出
  2. 使用 Ctrl + C
    如果你在查看 git log 的过程中,想要快速中断当前的命令,可以使用 Ctrl + C。这会在终端中断当前的 git log 命令,并返回到命令行提示符。
  3. 使用鼠标滚轮或滑动条:
    如果你使用的是支持鼠标滚动的终端(如某些IDE的内置终端或者某些配置的终端模拟器),你可以通过鼠标滚轮或滑动条来滚动查看历史记录,直到你找到想看的内容。这种方法不需要按键退出,但适用于不想中断命令的情况。
  4. 关闭终端窗口:
    最简单的方法是直接关闭终端窗口。虽然这不是从命令行内部退出,但如果你只是想结束查看操作,关闭窗口也是一种选择。

定制化的退出方式

对于一些特定的 git log 参数,你可能想要更详细地查看日志,例如使用 --stat 或 --patch 选项。在这些情况下,你也可以使用上述的 q 键或 Ctrl + C 来退出查看。例如:

bashCopy Codegit log --stat
# 查看后按 q 退出

或者:

bashCopy Codegit log --patch
# 查看后按 q 退出

总之,q 键和 Ctrl + C 是最常用的退出方法,但在任何情况下,直接关闭终端也是一个快速的选择。

php网站如何防注入

// 创建数据库连接
$dsn = “mysql:host=your_host;dbname=your_db”;
$username = ‘your_username’;
$password = ‘your_password’;

try {
$pdo = new PDO($dsn, $username, $password);
// 设置PDO错误模式为异常
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 准备SQL语句
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->bindParam(':username', $userInput); // 绑定参数
$userInput = "admin' -- "; // 用户输入
$stmt->execute();

// 获取结果
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($results);

} catch (PDOException $e) {
echo “Connection failed: ” . $e->getMessage();
}

python爬虫数据代码案例

import requests
from bs4 import BeautifulSoup

def fetch_page(url):
“”” 抓取网页内容 “””
try:
response = requests.get(url)
response.raise_for_status() # 检查请求是否成功
return response.text
except requests.RequestException as e:
print(f”Error fetching {url}: {e}”)
return None

def parse_page(html_content):
“”” 解析网页内容,提取所有链接 “””
soup = BeautifulSoup(html_content, ‘html.parser’)
links = []
for link in soup.find_all(‘a’, href=True):
links.append(link[‘href’])
return links

def main():
url = “http://example.com” # 替换为你要爬取的网址
html_content = fetch_page(url)
if html_content:
links = parse_page(html_content)
for link in links:
print(link)
else:
print(“Failed to fetch the page.”)

if name == “main“:
main()

确保你已经安装了requestsBeautifulSoup。如果还没有安装,可以通过以下命令安装

pip install requests beautifulsoup4

php字符串替换

str_ireplace() 和 str_replace() 函数

str_ireplace() 和 str_replace 使用新的字符串替换原来字符串中指定的特定字符串,str_replace 区分大小写,str_ireplace() 不区分大小写,两者语法相似。

str_replace(find,replace,string,count)

str_ireplace(find,replace,string,count)

参数描述
find必需。规定要查找的值。
replace必需。规定替换 find 中的值的值。
string必需。规定被搜索的字符串。
count可选。对替换数进行计数的变量。

<?php

header("Content-type:text/html;charset=utf-8");

$str = 'hello,world,Hello,world';

echo "原字符串:".$str."<br>";

$search = 'hello';

$replace = 'hi';

echo "<br>替换字符串:<br>";

echo str_replace($search, $replace, $str)."<br>";

echo str_ireplace($search, $replace, $str)."<br>";

?>

示例:

用js获取input的值,并用提示框显示出来

一、需求如下:

建立input输入框,设置其id为”study”,设置其值为”666″, 用js获取input的值,创建一个按钮叫”弹出”,点击”弹出”按钮,弹出input中的value的值。

二、思路:

(1)获取input输入框的value值
为input输入框设置id,name属性后,可以通过id或name来获取input的value值,这里使用id来获取input的value值

(2)创建”弹出”按钮
按钮的创建有多种,可以使用input,button标签等来创建,这里使用button标签

(3)使用js展示input中的value的值
可以为按钮设置onclick属性,并设定onclick对应的方法(这里创建了show这个方法),然后在show方法中使用alert方法来做提示信息,从而展示出input的value值

三、效果图:

点击”弹出”出现input中的value值

四、代码如下:

方案一、使用表单结合show方法

<html>
<head>

<title>弹出输入框的值</title>
<script type="text/javascript">
function show(){
 var a = myform.study.value; //使用id来获取input输入框的值
  alert(a);
};

</script>
</head>

<body>
<form name="myform">
  <input type="text" id="study" name="box"  value="666" />
   <button  onclick="show()">弹出</button>
</form>

</body>

</html>

除了使用id来获取input输入框的值,你也可以用name来获取input输入框的值,修改如下:

- var a = myform.study.value; 
+ var a = myform.box.value;

此外,你也可以使用input标签来创建按钮进行,例如将上面的按钮修改为:

- <button  onclick="show()">弹出</button>
+ <input type="button" onclick="show()" value="弹出" />

方案二、使用getElementId

<input id="study"  class="ob1" value="666" type="text">
<input type="button" class="intro" id="btn" value="弹出">
<script>
  document.getElementById("btn").onclick = function(){
    var v=document.getElementById("study").value;
    alert(v);
  }

除了使用getElementById获取指定的内容(这里是获取”弹出”按钮,然后为按钮绑定o’clock事件),还可以使用以下方法:

  • getElementsByTagName 通过标签来获取内容
  • getElementsByClassName 通过类名来获取内容

注意:getElementsByClassName() 在 Internet Explorer 5,6,7,8 中无效。

五、参考资料

1.JavaScript如何获得input元素value值
2.HTML DOM 访问

作者:稻草人_b788
链接:https://www.jianshu.com/p/ce9db183159d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

使用PHP客户端连接到websocket

这是我一直在使用的代码,已经在不同的论坛上广泛发布.但由于某种原因,我无法让它发挥作用.

任何帮助,将不胜感激.

$host = 'host';  //where is the websocket server
$port = 443; //ssl
$local = "http://www.example.com/";  //url where this script run
$data = '{"id": 2,"command": "server_info"}';  //data to be send

$head =        "GET / HTTP/1.1"."\r\n".
               "Upgrade: WebSocket"."\r\n".
               "Connection: Upgrade"."\r\n".
               "Origin: $local"."\r\n".
               "Host: $host"."\r\n".
               "Content-Length: ".strlen($data)."\r\n"."\r\n";
////WebSocket handshake
$sock = fsockopen($host, $port, $errno, $errstr, 2);
fwrite($sock, $head ) or die('error:'.$errno.':'.$errstr);
$headers = fread($sock, 2000);
fwrite($sock, "\x00$data\xff" ) or die('error:'.$errno.':'.$errstr);
$wsdata = fread($sock, 2000);  //receives the data included in the websocket package "\x00DATA\xff"
$retdata = trim($wsdata,"\x00\xff"); //extracts data
////WebSocket handshake
fclose($sock);

echo $retdata;

我可能更喜欢使用现有的websocket客户端库(可能是 https://github.com/gabrielbull/php-websocket-client或 https://github.com/Devristo/phpws/tree/master/src/Devristo/Phpws/Client?)而不是自己滚动,但我至少通过使用以下方式连接:

$head = "GET / HTTP/1.1"."\r\n".
    "Host: $host"."\r\n".
    "Upgrade: websocket"."\r\n".
    "Connection: Upgrade"."\r\n".
    "Sec-WebSocket-Key: asdasdaas76da7sd6asd6as7d"."\r\n".
    "Sec-WebSocket-Version: 13"."\r\n".
    "Content-Length: ".strlen($data)."\r\n"."\r\n";

我的服务器正在使用TLS / SSL,所以我还需要:

$sock = fsockopen('tls://'.$host, $port, $errno, $errstr, 2);

完整的协议规范是:https://tools.ietf.org/rfc/rfc6455.txt

apiDoc 使用指南

Version:1.0 StartHTML:000000201 EndHTML:000036428 StartFragment:000010634 EndFragment:000036390 StartSelection:000010634 EndSelection:000036390 SourceURL:https://www.jianshu.com/p/34eac66b47e3 apiDoc 使用指南 – 简书

安装

  1. 安装node.js
  2. 安装apiDoc

npm install apidoc -g

配置

在你的项目根目录下新建apidoc.json文件,该文件描述了项目对外提供接口的概要信息如名称、版本、描述、文档打开时浏览器显示标题和接口缺省访问地址。
apidoc.json

{
  "name": "ServiceEbikeAPIs",
  "version": "3.1.0",
  "description": "车辆服务接口文档",
  "title": "ServiceEbikeAPIs",
  "url" : "http://cjl3.rokyinfo.net:7190/api-ebike"
}

使用样例

/**
 *
 * @apiDefine RkNotFoundException
 *
 * @apiError RkNotFoundException 找不到相关数据
 *
 * @apiErrorExample Error-Response:
 *     HTTP/1.1 404 Not Found
 *     {
 *       "error": {
 *           "code": 404,
 *           "msg": "",
 *           "path" ""
 *       }
 *     }
 *
 */

/**
 *
 * @api {get} /v3.1/ues/:sn/rt-info 获取设备上报实时信息
 * @apiVersion 3.1.0
 * @apiName GetUeRealTimeInfo
 * @apiGroup UE
 *
 * @apiHeader {String} Authorization 用户授权token
 * @apiHeader {String} firm 厂商编码
 * @apiHeaderExample {json} Header-Example:
 *     {
 *       "Authorization": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjM2NzgsImF1ZGllbmNlIjoid2ViIiwib3BlbkFJZCI6MTM2NywiY3JlYXRlZCI6MTUzMzg3OTM2ODA0Nywicm9sZXMiOiJVU0VSIiwiZXhwIjoxNTM0NDg0MTY4fQ.Gl5L-NpuwhjuPXFuhPax8ak5c64skjDTCBC64N_QdKQ2VT-zZeceuzXB9TqaYJuhkwNYEhrV3pUx1zhMWG7Org",
 *       "firm": "cnE="
 *     }
 *
 * @apiParam {String} sn 设备序列号
 *
 * @apiSuccess {String} sn 设备序列号
 * @apiSuccess {Number} status 设备状态
 * @apiSuccess {Number} soc 电池电量百分比
 * @apiSuccess {Number} voltage 电池电压
 * @apiSuccess {Number} current 电池电流
 * @apiSuccess {Number} temperature 电池温度
 * @apiSuccess {String} reportTime 上报时间(yyyy-MM-dd HH:mm:ss)
 *
 * @apiSuccessExample Success-Response:
 *     HTTP/1.1 200 OK
 *     {
 *       "sn": "P000000000",
 *       "status": 0,
 *       "soc": 80,
 *       "voltage": 60.0,
 *       "current": 10.0,
 *       "temperature": null,
 *       "reportTime": "2018-08-13 18:11:00"
 *     }
 *
 * @apiUse RkNotFoundException
 *
 */
@RequestMapping(value = "/{sn}/rt-info", method = RequestMethod.GET)
public UeRealTimeInfo getUeRealTimeInfo(@RequestHeader(Constants.HEADER_LOGIN_USER_KEY) long userId, @PathVariable("sn") String sn) {

    return ueService.getRealTimeInfo(sn);
}

@api

@api {method} path [title]

HTTP接口调用方法、路径及名称

@apiVersion

@apiVersion version

api 版本号

@apiName

@apiName name

api 名称

@apiGroup

@apiGroup name

api 分组

@apiHeader

@apiHeader [(group)] [{type}] [field=defaultValue] [description]

请求头参数

@apiParam

@apiParam [(group)] [{type}] [field=defaultValue] [description]

请求参数

@apiSuccess

@apiSuccess [(group)] [{type}] field [description]

返回数据描述

@apiSuccessExample

@apiSuccessExample [{type}] [title]
                   example

接口成功返回样例

@apiError

@apiError [(group)] [{type}] field [description]

接口失败描述

@apiErrorExample

@apiErrorExample [{type}] [title]
                 example

接口失败返回样例

@apiDefine

@apiDefine name [title]
                     [description]

类似于宏定义,可以被引用

@apiUse

@apiUse name

使用@apiDefine定义的描述

更详细的说明请参考官方文档http://apidocjs.com

生成文档

cd到apidoc.json所在路径(即项目根目录)执行如下命令即可

apidoc -i src/ -o apidoc/

执行成功后会生成apidoc文件夹如下图所示

图片

点开apidoc文件夹中index.html会发现已经生成的漂亮的api文档

图片

作者:袁志健
链接:https://www.jianshu.com/p/34eac66b47e3
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

php-fpm: 某项目网站频繁出现503问题解决( WARNING: [pool www] server reached pm.max_children setting (50), consider raising it)

服务是nginx+php-fpm配置,

在运行过一段时间后,会经常出现:

12WARNING: [pool www] server reached pm.max_children setting (50), consider raising it子进程达到最大数量,需要提供子进程数

503/502一般是因为服务器维护或者过载,近期服务器并未进行维护,查询监控记录发现负载也不是很高,猜测是不是服务器对项目的某些配置产生了限制,查看nginx,php日志发现:

找到php-fpm.conf 文件 ,查找php日志错误

12345[15-Nov-2017 15:23:51] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it[15-Nov-2017 17:10:53] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it[15-Nov-2017 17:12:56] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it[15-Nov-2017 18:29:28] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it[16-Nov-2017 10:25:17] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it


该警告频繁出现,子进程达到最大数量,查询php-fpm配置文件www.conf,发现pm.max_children采用的是默认配置,显然是因为设定值过小导致

问题解决:

修改

1234pm.start_servers = 10   //php-fpm启动起始进程数pm.min_spare_servers = 10   //php-fpm的最小空闲进程数pm.max_spare_servers = 24   //php-fpm的最大空闲进程数pm.max_requests = 500   //所有子进程重启时间
参考:https://lirongyao.com/server-reached-pm-max_children-setting.html