一云博客 - 开发语言
type: channel
link: https://blog.yiyunt.cn/index.php/category/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/
items: [python] Python日志记录库loguru使用指北
items: SQLAlchemy之一对多关系
items: 宝塔上部署FastAPI的步骤和一些注意点
items: Python 数据结构
items: PHP中的一些常用的超全局变量总结
items: PHP 获取客户端真实IP地址
items: PHP定界符php和html代码混编方法实例详解
items: Python利用psutil库进行监控进程和资源
items: phpspreadsheet中文手册_php打开文件
items: css选择器备忘录

[python] Python日志记录库loguru使用指北
type: item
date: 2024-09-01T01:51:07+08:00
description: Loguru是一个功能强大且易于使用的开源Python日志记录库。它建立在Python标准库中的logging模块之上，并提供了更加简洁直观、功能丰富的接口。Logging模块的使用见： Python日志记录库logging总结 。Loguru官方仓库见：loguru，loguru官方文档见： loguru-doc。Loguru的主要特点包括：简单易用：无需复杂的配置和定制即可实现基本的日志记录和输出。灵活的日志格式：支持自定义日志格式，并提供丰富的格式化选项。丰富的日志级别：支持多种日志级别，例如DEBUG、INFO、WARNING、ERROR和CRITICAL。多种日志目标：可以将日志输出到终端、文件、电子邮件、网络服务器等目标。强大的日志处理功能：支持日志过滤、格式化、压缩、旋转等功能。支持异步日志记录：能够极大地提升日志记录的性能。支持跨进程、跨线程的日志记录：可以安全地记录多进程、多线程应用程序的日志。Loguru与logging是Python中常用的两个日志记录库，但两者在功能和易用性方面存在一些差异，如下所示：特性Logurulogging易用性更简单易用相对复杂日志格式更灵活较简单日志级别更丰富较少日志目标更多种类较少日志处理功能更强大较弱异步日志记录支持不支持跨进程、跨线程支持支持支持总的来说，loguru在易用性、功能性和性能方面都优于logging。如果要一个简单、强大且易于使用的日志系统，loguru是一个很好的选择。而如果只是需要快速输出一些调试信息，print可能就足够了。不过，对于生产环境，使用loguru或其他日志系统通常会更加合适。Loguru安装命令如下：pip install loguru# 查看loguru版本 import loguru print(loguru.__version__) # 输出：0.7.21 使用说明1.1 基础用法简单使用 Loguru的核心概念是只有一个全局的日志记录器，也就是logger。这个设计使得日志记录变得非常简洁和一致。使用Loguru时，你不需要创建多个日志实例，而是直接使用这个全局的logger来记录信息。这不仅减少了配置的复杂性，也使得日志管理更加集中和高效。from loguru import logger logger.debug("这是一个调试信息")输出：2024-06-29 19:57:44.506 | DEBUG | __main__::3 - 这是一个调试信息Loguru日志输出默认格式如下：时间戳：表示日志记录的具体时间，格式通常为年-月-日 时:分:秒.毫秒。日志级别：表示这条日志的严重性级别。进程或线程标识：表示日志来自哪个模块或脚本。 main 表示日志来自主模块。如果是其他文件会显示文件名。文件名和行号：记录日志消息的函数名和行号。日志消息：实际的日志内容，此外loguru支持使用颜色来区分不同的日志级别，使得日志输出更加直观.日志等级Loguru可以通过简单的函数调用来记录不同级别的日志，并自动处理日志的格式化和输出。这一特点可以让使用者专注于记录重要的信息，而不必关心日志的具体实现细节。Loguru支持的日志级别，按照从最低到最高严重性排序：TRACE: 最详细的日志信息，用于追踪代码执行过程。Loguru默认情况下使用DEBUG级别作为最低日志记录级别，而不是TRACE级别。这是因为TRACE级别会产生大量的日志信息。DEBUG: 用于记录详细的调试信息，通常只在开发过程中使用，以帮助诊断问题。INFO: 用于记录常规信息，比如程序的正常运行状态或一些关键的操作。SUCCESS: 通常用于记录操作成功的消息，比如任务完成或数据成功保存。WARNING: 用于记录可能不是错误，但需要注意或可能在未来导致问题的事件。ERROR: 用于记录错误，这些错误可能会影响程序的某些功能，但通常不会导致程序完全停止。CRITICAL: 用于记录非常严重的错误，这些错误可能会导致程序完全停止或数据丢失。from loguru import logger logger.debug("这是一条跟踪消息") logger.debug("这是一条调试信息") logger.info("这是一条普通信息") logger.success("操作成功完成") logger.warning("这是一条警告信息") logger.error("这是一条错误信息") logger.critical("这是一条严重错误信息")输出：2024-06-29 19:58:11.535 | DEBUG | __main__:<module>:3 - 这是一条跟踪消息 2024-06-29 19:58:11.536 | DEBUG | __main__:<modu…

SQLAlchemy之一对多关系
type: item
date: 2024-09-01T01:17:00+08:00
description: 1.创建单表class Test(Base): __tablename__ = 'user' nid = Colume(Integer,primary_key=True,autoincrement=True) name = Colume(String(32))2.创建一对多class Team(Base): __tablename__ = 'team' tid = Colume(Integer,primary_key=True,autoincrement=True) caption = Colume(String(32)) class user(Base): __tablename__ = 'user' nid = Colume(Integer,primary_key=True,autoincrement=True) name = Colume(String(32)) team_id = Colume(Integer,ForeignKey('team.gid'))写完类，接下来就是把类转化为数据库表了。3.生成表、删除表def init_db(): #根据Base去找它的子类，把所有的子类生成表。 Base.metadata.create_all(engine) def drop_db(): #把Base所有的子类对应表删除。 Base.metadata.drop_all(engine)from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://python:python@192.168.0.57:3306/python_mysql", max_overflow=5) Base = declarative_base() # 单表 class Test(Base): __tablename__ = 'test' nid = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(32)) # 一对多 class Team(Base): __tablename__ = 'team' tid = Column(Integer, primary_key=True, autoincrement=True) caption = Column(String(32)) class user(Base): __tablename__ = 'user' nid = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(32)) team_id = Column(Integer, ForeignKey('team.tid')) def init_db(): Base.metadata.create_all(engine) def drop_db(): Base.metadata.drop_all(engine) init_db()执行完上面代码后，就会在对应库生成test、user、group三张表，user表的group_id以group表的gid为外键。4.生成表后开始操作表，添加team表数据from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://python:python@192.168.0.57:3306/python_mysql", max_overflow=5) Base = declarative_base() # 单表 class Test(Base): __tablename__ = 'tes…

宝塔上部署FastAPI的步骤和一些注意点
type: item
date: 2024-09-01T01:09:36+08:00
description: {callout color="#999999"}为了运维方便，选择直接用宝塔来管理python fastapi的项目，虽然直接部署可能性能更好更灵活，但是我选择了低层本，每个人的选择可能是不一样的，各有 考虑吧。本文的大逻辑是先写一个helloworld的程序，然后再部署到服务器上{/callout}步骤一：先本地运行一个基于fastapi的helloWorld例子，方便后面在服务器上验证编写基于FastApi的Hello World文件main.pyimport uvicorn from fastapi import FastAPI app = FastAPI() @app.get("/") def sayHi(): return {"message":"Hello world!"} # 启动uvicorn服务，默认端口8000 uvicorn myapi:api --reload if __name__ == '__main__': uvicorn.run('main:app')显示本地运行跑通，本地可以使用vscode编译器，并在运行dos命令pip install fastapi[all] uvicorn main:app --reloadreload参数是为了修改代码后的热部署，运行没有报错后可以浏览器访问： http://127.0.0.1:8000如果看到打印信息则说明OK步骤二：在宝塔上部署python的环境商店安装插件python进程管理插件Python项目管理器：管理应用实例进程守护管理器：实例进程的守护进入Python项目管理器，首先安装python版本，尽量与本地的一致，避免出现本地好的，服务器上出现问题，特别怕依赖包不一致的问题。本地查看版本的命令是python --version在本地生成requirements.txt，否则宝塔创建项目会报错。创建命令如下pip freeze >requirements.txt pip install -r requirements.txt将代码上传到宝塔的/www/wwwpython/helloworld在python进程管理插件创建项目，具体参数如下，记得选择gunicon在配置修改参数，重启。默认为worker_class = 'geventwebsocket.gunicorn.workers.GeventWebSocketWorker' 修改为worker_class = 'uvicorn.workers.UvicornWorker'这里有一个坑，启动后系统会自动暂停，日志报错如下的话，是2个问题，一是启动文件名为main.py，二是启动文件是app，即在main.py中启动命令是：uvicorn.run('main:app')具体报错信息如下：Worker failed to boot.Traceback (most recent call last): File "/www/wwwpython/helloworld/helloworld_venv/lib/python2.7/site-packages/gunicorn/arbiter.py", line 586, in spawn_worker worker.init_process() File "/www/wwwpython/helloworld/helloworld_venv/lib/python2.7/site-packages/gunicorn/workers/ggevent.py", line 203, in init_process super(GeventWorker, self).init_process() File "/www/wwwpython/helloworld/helloworld_venv/lib/python2.7/site-packages/gunicorn/workers/base.py", line 135, in init_process self.load_wsgi() File "/www/wwwpython/helloworld/helloworld_venv/lib/python2.7/site-packages/gunicorn/workers/base.py", line 144, in load_wsgi self.wsgi = self.app.wsgi() File "/www/wwwpython/helloworld/helloworld_venv/lib/python2.7/site-packages/gunicorn/app/base.py", line 67, in wsgi self.callable = self.load() …

Python 数据结构
type: item
date: 2024-06-06T21:12:42+08:00
description: 逻辑结构特点：只是描述数据结构中数据元素之间的联系规律是从具体问题中抽象出来的数学模型，是独立于计算机存储器的(与机器无关)逻辑结构分类线性结构集合中必存在唯一的一个 "第一个元素"集合中必存在唯一的一个 "最后的元素"除最后元素之外，其他数据元素均有唯一的 "后继"除第一元素之外，其他数据元素均有唯一的 "前驱"树形结构(层次结构)树形结构指的是数据元素之间存在着"一对多"的树形关系的数据结构，是一类重要的非线性数据结构。在树形结构中，树根结点没有前驱结点，其余每个结点有且只有一个前驱结点。叶子结点没有后续结点，其余每个结点的后续节点数可以是一个也可以是多个。图状结构（网状结构)图是一种比较复杂的数据结构。在图结构中任意两个元素之间都可能有关系，也就是说这是一种多对多的关系。其他结构除了以上几种常见的逻辑结构外，数据结构中还包含其他的结构，比如集合等。有时根据实际情况抽象的模型不止是简单的某一种，也可能拥有更多的特征。存储结构特点:是数据的逻辑结构在计算机存储器中的映象（或表示)存储结构是通过计算机程序来实现的，因而是依赖于具体的计算机语言的。存储结构分类顺序存储顺序存储( Sequential Storage ):将数据结构中各元素按照其逻辑顺序存放于存储器一片连续的存储空间中。链式存储链式存储(Linked Storage )∶将数据结构中各元素分布到存储器的不同点，用记录下一个结点位置的方式建立它们之间的联系，由此得到的存储结构为链式存储结构。索引存储索引存储（ lndexed Storage ):在存储数据的同时，建立一个附加的索引表，即索引存储结构=数据文件+索引表。线性表的链式存储只能操作头部节点指向下一个定义将线性表L=(a0,a1.......an-1)中各元素分布在存储器的不同存储块，称为结点，每个结点（尾节点除外）中都持有一个指向下一个节 点的引用，这样所得到的存储结构为链表结构。特点逻辑上相邻的元素ai, ai+1，其存储位置也不一定相邻;存储稀疏，不必开辟整块存储空间。对表的插入和删除等运算的效率较高。逻辑结构复杂，不利于遍历。栈先进后出 --> 水桶定义栈是限制在一端进行插入操作和删除操作的线性表（俗称堆栈），允许进行操作的一端称为"栈顶”，另一固定端称为"栈底”，当栈中没有元素时称为空栈"。特点栈只能在一端进行数据操作栈模型具有先进后出或者叫做后进先出的规律队列先进先出 --> 排队定义队列是限制在两端进行插入操作和删除操作的线性表，允许进行存入操作的一端称为队尾”，允许进行删除操作的一健称为“队就-b特点:队列只能在队头和队尾进行数据操作队列模型具有先进先出或者叫做后进后出的规律树形结构定义树( Tree )是n ( n≥0 )个节点的有限集合T，它满足两个条件∶有且仅有一个特定的称为根(Root )的节点;其余的节点可以分为m ( m≥0 )个互不相交的有限集合T1、T2、......、Tm，其中每一个集合又是一棵树，并称为其根的子树( Subtree ) 。基本概念一个节点的子树的个数称为该节点的度数，一棵树的度数是指该树中节点的最大度数。度数为零的节点称为树叶或终端节点，度数不为零的节点称为分支节点，除根节点外的分支节点称为内部节点。一个节点的子树之根节点称为该节点的子节点，该节点称为它们的父节点，同一节点的各个子节点之间称为兄弟节点。一棵树的根节点没有父节点，叶节点没有子节点。一个节点系列k1,k2，......,ki,ki+1,......,kj,并满足ki是ki+1的父节点，就称为一条从k1到kj的路径，路径的长度为j-1,即路径中的边数。路径中前面的节点是后面节点的祖先，后面节点是前面节点的子孙。节点的层数等于父节点的层数加一，根节点的层数定义为树中节点层数的最大值称为该树的高度或深度。m ( m≥0 ）棵互不相交的树的集合称为森林。树去掉根节点就成为森林，森林加上一个新的根节点就成为树。二叉树定义二叉树( Binary Tree )是n ( n≥0 )个节点的有限集合，它或者是空集( n=0 ），或者是由一个根节点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成。二叉树与普通有序树不同，二叉树严格区分左孩子和右孩子，即使只有一个子节点也要区分左右。二叉树的特征工叉树第i ( i≥1)层上的节点最多为2i-1个。深度为k ( k≥1)的二叉树最多有2k一1个节点。在任意一棵二叉树中，树叶的数目比度数为2的节点的数目多一。满二叉树︰深度为k ( k≥1)时有2k一1个节点的二叉树。完全二叉树∶只有最下面两层有度数小于2的节点，且最下面一层的叶节点集中在最左边的若干位置上。二叉树的遍历沿某条搜索路径周游二叉树，对树中的每一个节点访问一次且仅访问一次。先序遍历︰先访问树根，再访问左…

PHP中的一些常用的超全局变量总结
type: item
date: 2024-04-30T16:17:29+08:00
description: 《PHP中的一些常用的超全局变量总结》PHP是一种广泛使用的服务器端脚本语言,它被用于开发各种Web应用程序,在PHP中,有一些特殊的全局变量,被称为超全局变量,在本文中,我们将深入了解PHP中的一些...php是一种广泛使用的服务器端脚本语言，它被用于开发各种Web应用程序。在PHP中，有一些特殊的全局变量，被称为超全局变量。超全局变量在整个脚本中都是可用的，无需使用global关键字来访问它们。1. $_GET:$_GET是一个关联数组，用于从URL中获取参数的值。当使用GET方法发送HTTP请求时，参数会附加在URL的末尾，例如：http://example.com/?id=123。可以使用$_GET来获取这些参数的值，例如$_GET['id']将返回123。这在处理表单提交、页面导航和URL参数传递时非常有用。2. $_POST:$_POST也是一个关联数组，用于从HTTP请求的正文中获取参数值。当使用POST方法发送HTTP请求时，参数会被包含在请求正文中，而不是URL中。可以使用$_POST来获取这些参数的值，例如$_POST['name']将返回提交的名称值。与$_GET相比，$_POST更适用于处理敏感数据，因为它们不会在URL中暴露出来。3. $_SERVER:$_SERVER是一个包含了服务器和执行环境信息的关联数组。它提供了许多有用的信息，如当前页面的URL、请求方法、客户端IP地址、服务器信息等。例如，$_SERVER['REQUEST_METHOD']将返回当前请求的方法，$_SERVER['REMOTE_ADDR']将返回客户端的IP地址。$_SERVER在处理会话管理、用户认证和访问控制时非常有用。4. $_SESSION:$_SESSION是用于在不同页面之间存储和访问会话数据的关联数组。它可以用来跟踪用户会话状态，存储用户信息，以及实现用户登录和注销等功能。使用$_SESSION，可以在不同的页面之间传递数据，并且数据在用户关闭浏览器后仍然保留。5. $_COOKIE:$_COOKIE是一个包含了客户端发送的HTTP Cookie的关联数组。Cookie是一种在客户端浏览器中存储数据的机制，用于跟踪用户状态和存储用户偏好设置。通过$_COOKIE，可以读取和修改Cookie的值，例如$_COOKIE['username']将返回存储在名为"username"的Cookie中的值。6. $_REQUEST:$_REQUEST是一个关联数组，包含了通过GET、POST和COOKIE方式提交的参数的值。它可以同时获取GET和POST的参数值。然而，由于它可以获取多种来源的参数，因此在使用之前需要注意安全性和数据一致性。7. $_FILES:$_FILES是一个关联数组，用于访问通过HTTP POST方法上传的文件。它包含了上传文件的属性，如文件名、文件类型、文件大小等。通过$_FILES，可以将上传的文件保存到服务器上的指定位置。8. $_ENV:$_ENV是一个包含了环境变量的关联数组。环境变量是在操作系统中设置的一些系统级别的值，在PHP中可以通过$_ENV来访问它们。例如，$_ENV['PATH']将返回操作系统中配置的路径。9. $GLOBALS:$GLOBALS是一个包含了全局变量的关联数组。它包含了脚本中定义的所有全局变量，以变量名为键名，变量值为键值。通过$GLOBALS，可以在任何地方访问和修改全局变量的值。总结这些超全局变量提供了丰富的功能，用于访问和操作PHP脚本中的各种数据和环境。它们在不同的场景下有不同的用途，例如获取用户输入、处理文件上传、访问系统环境变量等。在使用这些超全局变量时，需要注意安全性和数据验证，以确保应用程序的安全性和可靠性。需要注意的是，尽管超全局变量可以在任何地方访问，但在编写代码时应尽量避免过度使用它们，以免造成代码的混乱和不可维护性。合理使用超全局变量，可以帮助我们简化代码、提高开发效率，并使代码更具可读性和可维护性。超全局变量在PHP中发挥着重要作用，简化了许多常见的Web开发任务。它们提供了一种方便的方式来访问和操作请求参数、服务器信息、会话数据和Cookie。了解和正确使用这些超全局变量，可以帮助我们更高效地开发PHP应用程序，并确保数据的安全性和一致性。需要注意的是，由于超全局变量是全局范围的，因此要特别小心处理它们，以防止安全漏洞和数据冲突。在使用超全局变量时，应该进行验证和过滤，确保输入的数据是安全的，并避免直接使用它们来执行敏感操作。原文出处：http://www.cppcns.com/wangluo/php/641641.html

PHP 获取客户端真实IP地址
type: item
date: 2024-04-30T16:02:41+08:00
description: {callout color="#d1d1d1"} 《PHP获取客户端真实IP地址》PHP获取客户端真实IP地址,只要根据实际部署情况选择相对应的代码获取访客IP地址,是可以确保程序不被假IP欺骗的...{/callout} php获取客户端真实IP地址，需要根据具体的服务器环境来确定使用哪种方法。目前搜索到的方法，大多是直接贴代码，没有针对不同情况作出说明，有可能导致系统被假IP骗过（IP欺骗）。 很多文章都提到“无法保证获取到的访客IP地址100%准确”，是否意味着PHP获取访客IP一定有漏洞可钻呢？ 只要根据实际部署情况选择相对应的代码获取访客IP地址，是可以确保程序不被假IP欺骗的。PHP的运行方式 PHP支持非常多的运行方式，例如php-cgi、php-fpm、swoole、php-cli、php-mod等。其中，php-fpm是php的fast-cgi的进程管理器。php-mod通常配合Apache使用，而php-fpm通常配合Nginx使用。从PHP5.4开始，PHP甚至可以以内置PHP服务（Buid-in web server）方式运行。逐渐的，PHP形成了很多经典搭配，例如LAMP、LNMP、LNMPA、IIS+PHP。 无论采用哪种PHP运行方式，分清是谁传递IP给PHP程序即可。这里对几种常见环境进行分析。无代理层（PHP内置服务器/swoole） 由于客户端IP数据是从TCP/IP协议层传递过来的，因此在没有中间代理（客户端和服务器直连）的情况下，可以直接通过标准方法REMOTE_ADDR获得与PHP直接通讯的IP地址。 例如$_SERVER['REMOTE_ADDR']或getenv("REMOTE_ADDR")。 而在swoole中，可以通过$request->server['remote_addr']获得客户端IP地址。 在这种情况下，REMOTE_ADDR不可以显式的伪造，获取到的是实际与服务器连接的IP地址，是可靠的。Nginx代理（Nginx + php-fpm / Nginx + swoole） 常见的LNMP方案，属于Nginx反向代理。Nginx与php的通讯，无论Unix socket方式还是tcp socket方式，都跟Nginx的Header配置有关系。proxy_http_version 1.1; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; 可以在第一层nginx代理设置 proxy_set_header X-Forwarded-For $remote_addr,其他层nginx代理设置proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for,这样就可以通过X-Forwarded-For获取客户端真实IP地址。如果设置了X-Real-IP $remote_addr，则通过X-Real-IP获取客户端IP地址。PHP代码：// php-fpm等 $_SERVER['HTTP_X_FORWARDED_FOR']); // swoole $this->http_input->header('x-real-ip'); 总结来说，当有Nginx代理的情况下，需要根据具体配置来选择获取的Header，从而正确获取客户端IP地址，此时PHP中的的REMOTE_ADDR可能是最后一级代理的IP地址。Apache代理（Apache + php_mod / Apache + php-fpm） 通常在Apache + PHP方案中，获取IP地址取决于Apache配置信息。 绝大部分情况可以使用$_SERVER["REMOTE_ADDR"]获取到真实客户端IP地址。 如果Apache上级存在Nginx，那么可以在Apache中使用mod_rpaf模块将客户端IP地址传递到X-Forwarded-For头中。PAFheader X-Forwarded-For负载均衡/云虚拟机/Serverless 在负载均衡条件下，需要查阅对应负载均衡程序的文档，来决定使用哪种方法获取真实客户端IP地址。 在大部分虚拟主机、负载均衡及无服务器中，可以通过HTTP_CLIENT_IP、HTTP_X_FORWA…

PHP定界符php和html代码混编方法实例详解
type: item
date: 2024-04-30T15:49:06+08:00
description: {callout color="#d1d1d1"}《PHP定界符php和html代码混编方法实例详解》：本文主要介绍PHP定界符php和html代码混编方法实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...{/callout}正文 PHP定界符的运用，极大地方便了PHP和html混编的结构，因为在定界符中可以包括变量函数和html代码，而且可以正常解析。不用对字符串进行转义，可以是多行字符串。 PHP定界符是一种用于在字符串中定义大段代码的语法结构，它有三种形式：一、 HEREDOC（<<<）定界符 HEREDOC被称为“长字符串常量”，用于包含多行字符串。格式如下：$string = <<<EOT 这是一段多行字符串 可以包含变量以及任何其他语法 EOT; 在这个例子中，HEREDOC开始于"<<<EOT"，结束于"EOT;"，三个EOT之间的所有内容都是字符串，可以包含变量以及其他语法。 在PHP中，HEREDOC（Here Document）是一种用于创建多行字符串的语法结构。它允许您通过指定一个标识符来引用字符串。<<<是HEREDOC的定界符，用于指示开始和结束标识符之间的字符串是HEREDOC类型的。下面为大家写几个示例代码：1. 使用字符串字面量替换<<<：$name = <<<EOT Hello, world! This is a sample string. EOT; 在这个示例代码中，使用双引号包围的字符串字面量替换<<<，并在末尾添加了换行符EOT;作为结束标识符。2. 使用自定义标识符：$greeting = <<<Greetings Hello, $name! Greetings; 上述代码中，使用自定义的标识符Greetings来引用字符串。标识符可以是任何有效的PHP标识符，但通常建议使用有意义的名称。3. 嵌套使用HEREDOC：$message = <<<EOT Hello, $name! This is a sample message. Here's a list of fruits: $fruits EOT; 上述代码中，在字符串中使用另一个HEREDOC来创建嵌套的字符串。这允许您在字符串中嵌入多行文本。二、 NOWDOC（<<<'标识符'） NOWDOC与HEREDOC非常相似，但不会解析变量和特殊字符。NOWDOC是PHP中的另一种字符串语法结构，类似于HEREDOC，但不会解析其中的变量。NOWDOC使用单引号来定界字符串，并在<<<后的标识符前加上单引号。格式如下：$string = <<<'EOT' 这是一段多行字符串 不会解析包含在字符串中的任何变量或特殊字符 EOT; 注意到这里的标识符是用单引号包裹的，它与下面的纯文本是完全相同的。与HEREDOC不同，NOWDOC不会替换其中的变量或转义任何特殊字符。1. 基本示例：$message = <<<'EOT' Hello, world! This is a sample string. EOT; 该示例代码，使用NOWDOC的语法结构来创建一个多行字符串。由于使用了单引号定界符，其中的变量不会被解析。2. 使用自定义标识符：$greeting = <<<'Greetings' Hello, $name! Greetings; 在这个示例代码中，使用自定义的标识符Greetings来引用字符串。与NOWDOC一样，其中的变量不会被解析。 值得注意的是，由于NOWDOC不会解析字符串中的变量，因此您无法在其中引用或嵌入变量。如果需要在字符串中使用变量值，应该使用HEREDOC。所以NOWDOC适用于那些不需要解析变量的情况。使用单引号定界符的NOWDOC语法可以确保字符串中的文本保持原样，不会被解析或替换为变量值。三、短标签写法（<?= ?>） 短标签写法允许PHP代码直接嵌入HTML中，使用"<?="输出变量的值。例如：<?= $variable; ?> 在这个例子中，"$variable"的值将被输出到HTML页面中。请注意，您必须启用短标签才能使用它，通过在php.ini文件中将short_open_tag选项设置为"on"，或者在代码中使用"<?php"标记。四、使用<?php"标记在html代码中嵌入php代码，这种方法比较好用，但是代码看起来会比较乱！<?php $nus=rand(1,10);//赋值变量为0到10的随意数字 ?> html中嵌入php代码 随机数值是：<?php echo $nus;?> 注意，php代码不会在html文件中被解释，但是html代码可以在php文件中使用！五、把html代码赋值给php变量在php代码中，把html代码赋值给php变量也可以…

Python利用psutil库进行监控进程和资源
type: item
date: 2024-04-30T14:51:02+08:00
description: 《Python利用psutil库进行监控进程和资源》psutil是Python系统和进程工具库,它提供了一种跨平台的方式来获取系统信息、管理系统进程、监控系统性能、操作系统资源等,下面就跟随小编一起来... python作为一门强大的编程语言，拥有丰富的标准库和第三方库，使得开发者可以轻松完成各种任务。在系统监控和管理方面，psutil库无疑是一个强大的工具，它可以轻松地获取系统信息、管理进程、监控系统性能等。本文将深入探讨psutil库，介绍它的基本概念、用法和示例代码，帮助大家更好地理解和利用这个强大的库。什么是psutil库psutil是Python系统和进程工具库（Python System and Process Utilities）。它提供了一种跨平台的方式来获取系统信息、管理系统进程、监控系统性能、操作系统资源等。无论是在Windows、linux还是MACOS，psutil都能提供一致的API，使得开发者可以轻松地编写跨平台的代码。安装psutil库要开始使用psutil库，首先需要安装它。可以使用pip来进行安装：pip install psutil安装完成后，就可以导入并开始使用psutil库了。import psutil获取系统信息获取CPU信息import psutil # 获取CPU核心数 cpu_count = psutil.cpu_count(logical=False) print(f"Physical CPU Count: {cpu_count}") # 获取逻辑CPU核心数（包括超线程） logical_cpu_count = psutil.cpu_count(logical=True) print(f"Logical CPU Count: {logical_cpu_count}") # 获取CPU使用率 cpu_usage = psutil.cpu_percent(interval=1, percpu=True) for i, usage in enumerate(cpu_usage, 1): print(f"CPU {i} Usage: {usage}%")获取内存信息import psutil # 获取内存总量 total_memory = psutil.virtual_memory().total print(f"Total Memory: {total_memory / (1024 ** 3):.2f} GB") # 获取可用内存 available_memory = psutil.virtual_memory().available print(f"Available Memory: {available_memory / (1024 ** 3):.2f} GB") # 获取内存使用率 memory_usage = psutil.virtual_memory().percent print(f"Memory Usage: 1.15MB%")获取磁盘信息import psutil # 获取所有磁盘分区信息 disk_partitions = psutil.disk_partitions() for partition in disk_partitions: print(f"Device: {partition.device}") print(f"Mountpoint: {partition.mountpoint}") print(f"Fstype: {partition.fstype}") print("") # 获取指定分区的使用情况 disk_usage = psutil.disk_usage("/") print(f"Total: {disk_usage.total / (1024 ** 3):.2f} GB") print(f"Used: {disk_usage.used / (1024 ** 3):.2f} GB") print(f"Free: {disk_usage.free / (1024 ** 3):.2f} GB") print(f"Usage: {disk_usage.percent}%")获取网络信息import psutil # 获取网络接口列表 network_interfaces = psutil.net_if_addrs() for interface, addresses in network_interfaces.items(): print(f"Interface: {interface}") for address in addresses: print(f" Family: {address.family}") print(f" Addres…

phpspreadsheet中文手册_php打开文件
type: item
date: 2024-04-28T17:05:28+08:00
description: 简介PhpSpreadsheet要求PHP 7.3及以上版本，是PHPExcel库的扩展版本，可用来读写xls、xlsx、CSV、HTML等格式文件。FormatReadingWritingOpen Document Format/OASIS (.ods)✓✓Office Open XML (.xlsx) Excel 2007 and above✓✓BIFF 8 (.xls) Excel 97 and above✓✓BIFF 5 (.xls) Excel 95✓ SpreadsheetML (.xml) Excel 2003✓ Gnumeric✓ HTML✓✓SYLK✓ CSV✓✓PDF (using either the TCPDF, Dompdf or mPDF libraries, which need to be installed separately) ✓PhpSpreadsheet安装方法可参考 禅道二次开发（四）：集成PhpSpreadsheet解析Excel文件 下面来介绍PhpSpreadsheet读写excel格式文件方法写入excel文件以写入Xlsx格式文件为例，<?php require 'vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; /* 写入excel */ $fileName = './test.xlsx'; $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); $sheet->setCellValue('A1', 'Hello World !'); $sheet->setCellValue('C3', '你好 !'); $writer = new Xlsx($spreadsheet); $writer->save($fileName); ?>工作表默认样式可以设置工作表默认样式，比如$spreadsheet->getDefaultStyle()->getFont()->setName('宋体'); // 字体 $spreadsheet->getDefaultStyle()->getFont()->setSize(8); // 字体大小 $spreadsheet->getDefaultStyle()->getAlignment()->setWrapText(true); // 自动换行 $spreadsheet->getDefaultStyle()->getAlignment()->setVertical(Alignment::VERTICAL_CENTER); //垂直居中单元格样式use PhpOffice\PhpSpreadsheet\Style\Alignment; $spreadsheet->getActiveSheet()->getStyle('A1:D4')->getAlignment()->setWrapText(true); // 自动换行 $caseSpreadsheet->getActiveSheet()->getStyle('A1:D4')->getAlignment()->setVertical(Alignment::VERTICAL_CENTER); //垂直居中单元格对齐方式包括水平对齐和垂直对齐：// 水平对齐样式 HORIZONTAL_GENERA HORIZONTAL_LEFT HORIZONTAL_RIGHT HORIZONTAL_CENTER HORIZONTAL_CENTER_CONTINUOUS HORIZONTAL_JUSTIFY HORIZONTAL_FILL HORIZONTAL_DISTRIBUTED // Excel2007 only // 垂直对齐样式 VERTICAL_BOTTOM VERTICAL_TOP VERTICAL_CENTER VERTICAL_JUSTIFY VERTICAL_DISTRIBUTED // Excel2007 only除了设置单元格的字体，还可以设置边框，填充颜色等样式信息。比如设置单元格背景颜色：$spreadsheet->getActiveSheet()->getStyle('E2')->getFill() ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID) ->getStartColor()->setARGB('FFFF0000'); // 多个单元格，如果设置多个单元…

css选择器备忘录
type: item
date: 2024-04-18T16:32:05+08:00
description: {mtitle title="目录信息"/}啥是CSS选择器通用选择器 - *元素选择器 - element类名选择器 - .classID 选择器 - #id多选择器 - .class.class-2逗号组合 - .class, .class-2后代选择器 - .class .class-2相邻兄弟选择器 - .class + .class-2子选择器 - .class > .class-2兄弟选择器 - .class ~ .class-2脑残猫头鹰选择器 - + 属性选择器 - []链接伪类选择器input相关第N个孩子指定类型的第N个孩子伪类选择器伪元素0. 啥是CSS选择器CSS选择器 是用于选择 HTML 元素并为其应用样式的一种机制。选择器允许我们根据元素的 类型 、 属性 、 位置 以及其他特征来选择要样式化的元素，从而实现对网页样式的精确控制。以下是一些常见的 CSS 选择器及其用途：「元素选择器（Element Selector）」 ：选择指定类型的 HTML 元素。例如， p 选择所有段落元素。「类选择器（Class Selector）」 ：选择具有指定类名的元素。以点号（ . ）开头，后跟类名。例如， .button 选择所有类名为 button 的元素。「ID 选择器（ID Selector）」 ：选择具有指定 ID 的元素。以井号（ # ）开头，后跟 ID 名称。例如， #header 选择 ID 为 header 的元素。「后代选择器（Descendant Selector）」 ：选择指定元素的后代元素。使用 空格 分隔两个选择器，其中第一个选择器表示 父元素第二个选择器表示 后代元素例如， div p 选择所有 元素内部的所有段落 元素。「相邻兄弟选择器（Adjacent Sibling Selector）」 ：选择紧接在另一个元素后面的元素。使用加号（ + ）符号连接两个选择器，其中第一个选择器表示 第一个元素第二个选择器表示其 紧邻的兄弟元素例如， h2 + p 选择所有紧接在 元素后面的 元素。「通用选择器（Universal Selector）」 ：选择页面中的 「所有元素」 。使用星号（ * ）表示。例如， * 选择页面中的所有元素。除了这些基本的选择器外，CSS 还提供了许多其他类型的选择器，如 伪类选择器 （例如 :hover 、 :active ）、 伪元素选择器 （例如 ::before 、 ::after ）、 属性选择器 （例如 [type="text"] ）等，可以根据具体的需求选择合适的选择器来对页面元素进行样式化。{dotted startColor="#ff6c6c" endColor="#1989fa"/}1. 通用选择器 - *CSS的 通用选择器 是一个星号（ * ），它匹配文档中的 「任何元素」 。使用通用选择器，我们可以选择页面上的 「所有元素」 ，并为它们应用相同的样式。例如，如果我们想为页面上的所有元素设置相同的字体样式，我们可以使用通用选择器来实现。{callout color="#2bff00"}但要注意，过度使用通用选择器可能会导致 「性能问题」 ，因为它会匹配页面上的所有元素，包括嵌套元素，这可能会增加浏览器的渲染负担。因此，建议在必要时谨慎使用通用选择器。{/callout}{dotted startColor="#ff6c6c" endColor="#1989fa"/}2. 元素选择器 - element元素选择器 是 CSS 中最简单的选择器之一，它通过指定 HTML 元素的名称来选择元素。例如，要选择所有段落元素 ，我们可以使用以下选择器：p { /* CSS 样式 */ }这将选择页面中的所有段落元素，并应用所指定的 CSS 样式。{dotted startColor="#ff6c6c" endColor="#1989fa"/}3. 类名选择器 - .class类选择器 用于选择具有特定类名的 HTML 元素。类选择器以点号（ . ）开头，后跟类名。例如，如果我们有一个类名为 button 的按钮元素，我们可以使用类选择器来选择它：.button { /* CSS 样式 */ }这将选择页面中所有具有类名 button 的元素，并应用所指定的 CSS 样式。类选择器使我们可以为页面中的 「多个元素定义相同的样式」 ，而不必重复定义。此外，一个元素可以同时具有多个类，这样就可以轻松地将多个样式应用于同一个元素。{dotted startColor="#ff6c6c" endColor="#1989fa"/}4. ID 选择器 - #idID 选择器 是 CSS 中用于选择具有特定 ID 属性的 HTML 元素的选择器。ID 选择器以井号（…