php exit codes说明

当使用php-cli执行php脚本,正常结束时,exitCode=0, 非正常结束时,exitCode为1~255的值,这些值代表什么平时往往也不会太关注。但是笔者最近遇到一个问题,在php中不小心循环递归调用函数时,最终会出现segmentation fault (此处可以推测出进程收到SIGSEGV信号)。这个栈内存溢出错误,try catch不到,register_shutdown_function也hook不到, 只看到exitCode=139。所以,这时有必要了解一下exitCode代表的含义.

Exit Code NumberMeaning
1一般的错误,如除零错误等
2缺少关键字或命令,或权限问题
126权限问题或命令不是可执行文件
127"command not found"
128exit($code), $code不是0~255时触发
128+nn的值代表信号值, 本文遇到exitCode=139, 所以n=139-128=11, 代表信号:SIGSEGV
130被 Control-C终止,SIGINT=130-128, 符合上一条128+n
255exit(-1),不是0~255则转为255

鉴于以上命令说明,在php-cli中,exit函数不能随意设置exitCode,否则容易和定义的exitCode规范混淆在一起。

### PHP实现防伪查询功能 在PHP中实现防伪查询功能通常涉及以下几个方面:创建唯一的防伪码、存储这些防伪码以便后续验证以及提供接口供用户输入并校验防伪码。以下是具体实现方法: #### 创建唯一防伪码 可以利用`uniqid()`函数生成基于当前时间戳的唯一ID,或者通过组合其他数据来增强随机性和安全性。 ```php function generateUniqueCode($prefix = '') { $unique_code = $prefix . uniqid(mt_rand(), true); return str_replace('.', '', $unique_code); // 去掉可能存在的点号 } ``` 此代码片段用于生成带有前缀(可选)的独特字符串作为防伪码[^1]。 #### 存储防伪码 为了能够后期验证用户的输入是否正确,需要将生成好的防伪码保存下来。这里可以选择数据库或者其他持久化方式如文件系统等来进行管理。 假设我们采用MySQL数据库表结构如下: - `id`: 自增主键; - `code`: 防伪编码字段; - `status`: 表明该条记录的状态,默认未被使用设为0;当成功匹配一次后更新成1表示已消耗不可再用。 插入新纪录到上述表格中的SQL语句示例: ```sql INSERT INTO codes (code, status) VALUES ('<?php echo htmlspecialchars(generateUniqueCode()); ?>', 0); ``` 注意这里的HTML特殊字符转义是为了防止潜在的安全风险比如XSS攻击等问题[^2]。 #### 用户端提交与服务器端校验逻辑 构建简单的HTML页面让用户填写他们收到的产品上的防伪号码并通过POST请求发送给后台处理脚本进行核对操作。 前端表单例子: ```html <form action="verify.php" method="post"> 输入您的产品防伪编号:<br> <input type="text" name="entered_code"><br><br> <button type="submit">确认</button> </form> ``` 而后台verify.php的内容大概像这样子写出来: ```php if ($_SERVER["REQUEST_METHOD"] == "POST") { include 'db_connection.php';//连接至数据库 $entered_code = $_POST['entered_code']; try{ $stmt = $conn->prepare("SELECT * FROM codes WHERE code=? AND status=0 LIMIT 1"); $stmt->bind_param("s", $entered_code); /* execute statement */ $stmt->execute(); $result = $stmt->get_result(); if ($row = $result->fetch_assoc()) { // 更新状态表明已被查证过 $update_stmt = $conn->prepare("UPDATE codes SET status=1 WHERE id=?"); $update_stmt->bind_param("i", $row['id']); if (!$update_stmt->execute()){ die('Error updating record'); } echo "<h3>恭喜您!这是正品。</h3>"; }else{ echo "<h3>对不起,未能找到对应的防伪信息或该商品已经经过验证。</h3>"; } /* close statement and connection */ $stmt->close(); $conn->close(); }catch(Exception $e){ error_log($e->getMessage()); http_response_code(500); exit; } } else { echo '<p style="color:red;">非法访问</p>'; } ``` 以上就是整个流程的大致描述及其对应的部分实际应用代码展示[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值