文章851
标签121
分类10

PHP 实例化对象注销

诶呀 , 这个问题说出来有些傻X , 但不测试一下. 写程序心里还是发慌.
PHP的内存回收原理, 不多说了 自己看手册. 就是个引用计数器, 变量上没有数量就回收了.
对象也是一样, 当你实例化的对象赋值到变量上, 这个对象的引用关系就赋值到变量上了. 如果重新赋值对象变量, 原有对象也就没有计数了, 也就被注销了.

举个栗子:

<?php

class Obj {

    public function __construct()
    {
        echo __FUNCTION__, PHP_EOL;
    }

    public function __destruct()
    {
        echo __FUNCTION__, PHP_EOL;
    }
}

$data = new Obj();

$i =0 ;
do { 
       if ($i > 3) {
        $data = []; // 注销对象 unset 也 ok 只要计数归零 对象就会注销 (swoole 对象内生成定时器问题 待测试)
    }
    sleep(1);
    echo $i++, PHP_EOL;
} while($i < 5);

运行后输出

localhost:Desktop admin$ php test.php 
__construct
0
1
2
3
__destruct
4
localhost:Desktop admin$ 

答案很明显了, 重新赋值对象变量, 析构函数触发.

Linux查看进程运行的完整路径

在 Linux 系统中,了解进程的运行状态和相关信息是系统管理的重要任务。查看进程的完整路径可以帮助我们更好地监控、调试和管理进程。本文将介绍几种在 Linux 中查看进程运行的完整路径的方法。

1. 使用 ps 命令

ps(process status)命令是最常用的查看进程信息的工具。要查看进程的完整路径,可以使用以下命令:

1.1 显示所有进程的完整路径

ps -eo pid,comm,args
  • -e:显示所有进程。
  • -o:自定义输出格式。

    • pid:进程 ID。
    • comm:执行程序的名称。
    • args:启动进程时的完整命令行。

1.2 示例

ps -eo pid,comm,args | grep nginx

这将显示所有与 nginx 相关的进程及其完整路径。

2. 使用 pgrepreadlink

pgrep 命令可以根据进程名称查找进程 ID,而 readlink 命令可以用于获取进程的完整路径。

2.1 示例

pid=$(pgrep nginx)
readlink -f /proc/$pid/exe
  • pgrep nginx:查找 nginx 进程的 PID。
  • readlink -f:获取 /proc/[pid]/exe 的完整路径。

3. 使用 top 命令

top 命令是一个实时监控系统进程的工具。在 top 界面中,可以查看进程的基本信息。

3.1 启动 top

top

3.2 显示完整路径

top 界面中,按下 c 键可以切换显示模式,从而显示完整的命令行。

4. 使用 htop

htoptop 的增强版,提供了更友好的用户界面。

4.1 安装 htop

在大多数 Linux 发行版中,可以通过包管理器安装:

sudo apt install htop  # Ubuntu/Debian
sudo yum install htop  # CentOS/RHEL

4.2 启动 htop

htop

htop 界面中,可以直接查看每个进程的完整命令行信息。

5. 通过 /proc 文件系统

Linux 的 /proc 文件系统提供了关于正在运行进程的详细信息。每个进程都有一个对应的目录,您可以直接查看。

5.1 查看特定进程的路径

cat /proc/[pid]/cmdline

这将显示进程启动时的命令行参数。

5.2 示例

cat /proc/1234/cmdline

1234 替换为您要查询的进程 ID。

6. 结论

在 Linux 中查看进程运行的完整路径可以通过多种方法实现,包括使用 pspgreptophtop 和直接访问 /proc 文件系统。根据具体需求和使用习惯,您可以选择最适合您的方法。希望本文能帮助您更好地管理和监控 Linux 系统中的进程。

自建短链接服务

Swoole ERROR swFactoryProcess_finish (ERROR 1004)

经常发现这个错误 虽然不影响线上服务, 但还是找下问题

[2019-01-08 19:12:31 *1955.15]  NOTICE  swFactoryProcess_finish (ERROR 1004): send 511 byte failed, because 
connection[fd=13] is closed.

通过 swoole 论坛 : https://group.swoole.com/question/106324

韩大大 回复是 : 这种错误请忽略吧,出错原因是发送数据时连接已经关闭了。有些客户端确实会出现这种情况。

Crontab定时任务不执行的原因

今天真是长知识 用了 crontab 这么久 才知道原来也需要 启动
添加了定时任务 但是并不好使

[root@dev-gl-lh1 ApiAgent]# cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

# 缓存coin 映射数据
*/5 * * * * root /usr/bin/php /data/application/SwooleMoney/script/bin/cli.php CacheData cacheCoinMap

# 缓存交易对信息
*/1 * * * * root /usr/bin/php /data/application/SwooleMoney/script/bin/cli.php CacheData cacheSymbol

# 删除深度数据
*/1 * * * * root /usr/bin/php /data/application/SwooleMoney/script/bin/cli.php CacheData clearExchangeDepths >/tmp/clearExchangeDepths.log

每分钟执行一次脚本 但等到花都谢了 都没等到日志

# 查看crontab 状态
[root@dev-gl-lh1 ApiAgent]# /etc/init.d/crond status 
crond dead but pid file exists
# 启动crontab 服务
[root@dev-gl-lh1 ApiAgent]# /etc/init.d/crond start
Starting crond:                                            [  OK  ]

得嘞 日志有输出了 脚本成功执行, 涨知识了.

参考地址: https://blog.csdn.net/u011734144/article/details/54576469

">