123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- <?php
- /**
- * 加载配置
- */
- function load_config()
- {
- $GLOBALS['cfg'] = include(CONFIG_FILE);
- }
- /**
- * 写入调试日志
- * @param string $msg 日志消息
- * @param string $type 日志级别
- * @param string $file 文件名
- * @return bool 操作状态
- */
- function debug_log($msg, $type = 'DEBUG', $file = 'debug')
- {
- global $cfg;
- $type = strtoupper($type);
- if (!in_array($type, $cfg['log_types'])) {
- return false;
- }
- $msg = is_scalar($msg) ? strval($msg) : json_encode($msg, JSON_UNESCAPED_UNICODE);
- $file = $cfg['log_path'] . '/' . $file . '.log';
- clearstatcache(true, $file);
- $flags = (file_exists($file) && filesize($file) >= $cfg['log_max_size']) ? 0 : FILE_APPEND;
- return file_put_contents($file, date("[Y-m-d H:i:s] ") . $type . ': ' . $msg . "\n", $flags);
- }
- /**
- * 确保只有一个实例在运行
- * @param int $workerId WorkerID
- * @return string 锁文件路径
- */
- function run_single_instance($workerId)
- {
- //锁文件路径
- $lock = __DIR__ . '/' . basename($_SERVER['argv'][0], '.php') . '.' . $workerId . '.pid';
- //清除缓存,避免 file_exists() 取到缓存的结果
- clearstatcache(true, $lock);
- //检查锁文件
- if (file_exists($lock)) {
- $saved = trim(file_get_contents($lock));
- $count = intval(shell_exec("ps -Fp {$saved} | grep '{$_SERVER['argv'][0]}' | grep -v grep | wc -l"));
- if ($count > 0) {
- exit(0);
- }
- shell_exec("ps -Fp {$saved}| grep '{$_SERVER['argv'][0]}' | grep -v grep | awk '{print $2}' | xargs --no-run-if-empty kill"); //安全起见再kill一次
- }
- //保存当前进程ID
- if (!file_put_contents($lock, getmypid() . "\n")) {
- echo "Start failed: {$lock} write failed\n";
- exit(1);
- }
- return $lock;
- }
- /**
- * 使用cURL发送POST请求
- * @param string $url 请求地址
- * @param array $post POST数据数组
- * @param array $options HTTP选项数组
- * @param string $error 用于返回错误信息
- * @param int $errno 用于返回错误码
- * @param string $httpCode 用于返回响应的HTTP状态码
- * @param array $outHeaders 用于获得返回的HTTP头
- * @return mixed 成功返回请求返回结果,失败返回flase
- */
- function curl_post($url, $post = [], $options = [], &$error = false, &$errno = false, &$httpCode = false, $isupload = false, &$outHeaders = false)
- {
- $heads = array();
- $defaults = [
- CURLOPT_POST => 1,
- CURLOPT_URL => $url,
- CURLOPT_RETURNTRANSFER => 1,
- CURLOPT_CONNECTTIMEOUT => 5,
- CURLOPT_TIMEOUT => 10,
- CURLOPT_POSTFIELDS => ($isupload || is_string($post)) ? $post : http_build_query($post),
- ];
- if ($isupload) {
- $defaults[CURLOPT_SAFE_UPLOAD] = true;
- }
- if (is_array($outHeaders)) {
- $defaults[CURLOPT_HEADERFUNCTION] = function ($c, $v) use(&$outHeaders) {
- if(!empty(rtrim($v))) {
- list($field, $value) = explode(':', $v, 2);
- if ($field && $value) {
- $outHeaders[strtolower($field)] = trim($value);
- }
- }
- return strlen($v);
- };
- }
- $ch = curl_init();
- $result = '';
- if ($ch) {
- foreach ($options as $k=>$v) {
- $defaults[$k] = $v;
- }
- curl_setopt_array($ch, $defaults);
- $result = curl_exec($ch);
- if ($result === false) {
- if ($error !== false) {
- $error = curl_error($ch);
- }
- if ($errno !== false) {
- $errno = curl_errno($ch);
- }
- }
- if ($httpCode !== false) {
- $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
- }
- curl_close($ch);
- }
- return $result;
- }
- /**
- * 使用cURL发送GET请求
- * @param string $url 请求地址
- * @param array $post GET数据数组
- * @param array $options HTTP选项数组
- * @param string $error 用于返回错误信息
- * @param int $errno 用于返回错误码
- * @param string $httpCode 用于返回响应的HTTP状态码
- * @param array $outHeaders 用于获得返回的HTTP头
- * @return mixed 成功返回请求返回结果,失败返回flase
- */
- function curl_get($url, $get = [], $options = [], &$error = false, &$errno = false, &$httpCode = false, &$outHeaders = false)
- {
- $defaults = [
- CURLOPT_URL => $url. (strpos($url, '?') === FALSE ? '?' : '&'). http_build_query($get),
- CURLOPT_HEADER => 0,
- CURLOPT_RETURNTRANSFER => TRUE,
- CURLOPT_CONNECTTIMEOUT => 5,
- CURLOPT_TIMEOUT => 10,
- ];
- if (is_array($outHeaders)) {
- $defaults[CURLOPT_HEADERFUNCTION] = function ($c, $v) use(&$outHeaders) {
- if (!empty(rtrim($v))) {
- list($field, $value) = explode(':', $v, 2);
- if ($field && $value) {
- $outHeaders[strtolower($field)] = trim($value);
- }
- }
- return strlen($v);
- };
- }
- $ch = curl_init();
- $result = '';
- if ($ch) {
- foreach ($options as $k=>$v) {
- $defaults[$k] = $v;
- }
- curl_setopt_array($ch, $defaults);
- $result = curl_exec($ch);
- if ($result === false) {
- if ($error !== false) {
- $error = curl_error($ch);
- }
- if ($errno !== false) {
- $errno = curl_errno($ch);
- }
- }
- if ($httpCode !== false) {
- $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
- }
- curl_close($ch);
- }
- return $result;
- }
|