最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】PHP代码尝试使用vsprintf期间出错无任何输出

PHP crifan 3526浏览 0评论

【问题】

折腾:

【已解决】将Log函数的参数改变为类似于sprintf的动态个数的可变参数

期间,已经调试了半天了,

对于如下代码:

(1)crifanLib.php

<?php
/*
[Filename]
crifanLib.php

[Function]
crifan's php lib, implement common functions

[Author]
Crifan Li

[Contact]
https://www.crifan.com/contact_me/

[Note]
1.online see code:
http://code.google.com/p/crifanlib/source/browse/trunk/php/crifanLib.php

[TODO]

[History]
[v2015-07-27]
1.add logInit, logWrite

[v1.0]
1.initial version, need clean up later

*/

class crifanLib {
    private $logFile;

    function __construct() {
        $this->logInit();
    }
    
   function __destruct() {

   }

    /***********************************************************************************************
    * String/Path
    ***********************************************************************************************/
    
    /*
     * 【已解决】PHP中如何实现路径拼接(两个路径合并)以及合并文件夹路径和文件名
     * https://www.crifan.com/php_path_concatenation_combine_directory_and_filename
     * eg:
     * from:
     * D:\tmp\WordPress\DevRoot\httpd-2.2.19-win64\httpd-2.2-x64\htdocs\php_test\35934503_data
     * cookie_jar.txt
     * to:
     * D:\tmp\WordPress\DevRoot\httpd-2.2.19-win64\httpd-2.2-x64\htdocs\php_test\35934503_data\cookie_jar.txt
     */
    function concatenatePath($headPath, $tailPath) {
        $realHeadPath = realpath($headPath);
        // printAutoNewline("realHeadPath=".$realHeadPath);
        //$realTailPath = realpath($tailPath);
        //printAutoNewline("realTailPath=".$realTailPath);
        //$concatnatedPath = $realHeadPath.DIRECTORY_SEPARATOR.$realTailPath;
        // printAutoNewline("tailPath=".$tailPath);
        
        $concatnatedPath = $realHeadPath.DIRECTORY_SEPARATOR.$tailPath;
        // printAutoNewline("concatnatedPath=".$concatnatedPath);
        return $concatnatedPath;
    }

    /***********************************************************************************************
    * Log
    ***********************************************************************************************/
    
    /*
        Init log file
    */
    function logInit($inputLogFile = null) {
        // set default log file name, path is current php file

        //logFolder=/var/www/1.2.3.4/public_html/php/access_token
        $logFolder = getcwd();
        //logFilename=log_20150727131103.log
        $logFilename = "log_".date('YmdHis').".log";
        //defautLogFile=/var/www/1.2.3.4/public_html/php/access_token/log_20150727131103.log
        $defautLogFile = $this->concatenatePath($logFolder, $logFilename);

        $this->logFile = $inputLogFile ? $inputLogFile : $defautLogFile;
    }

    /*
        Write log info to file
    */
    function logWrite($logFormat, $logArgs = ()) {
        echo "Into logWrite";
        print("logFormat=".$logFormat.'\r\n');
        print("logArgs=".$logArgs.'\r\n');
        $logFormatedContent = vsprintf($logFormat, $logArgs);
        print("logFormatedContent=".$logFormatedContent.'\r\n');
        
        // define script name
        $scriptName = pathinfo($_SERVER['PHP_SELF'], PATHINFO_FILENAME);
        // define current time and suppress E_WARNING if using the system TZ settings
        // (don't forget to set the INI setting date.timezone)
        $timeStr = @date('[Y-m-d H:i:s]');
        
        // write current time, script name and message to the log file
        //[2015-07-27 13:11:03] (wx_access_token) This is crifanLib log test
        file_put_contents($this->logFile, "$timeStr ($scriptName) $logFormatedContent" . PHP_EOL, FILE_APPEND);
    }

    /**
     * add newline for print
     */
    function printAutoNewline($contentToPrint) {
        print_r($contentToPrint."<br />");
    }

}

 ?>

 

wx_access_token.php

<?php
/*
    File:       wx_access_token.php
    Author:     Crifan Li
    Version:    2015-07-27
    Contact:    https://www.crifan.com/about/me/
    Function:   Wechat get access token
*/

include_once "crifanLib.php";

echo "before define";
//global definition
// define("TOKEN", "didaosuzhou");
define("APPID", "xxxxx"); //18 characters
// define("EncodingAESKey", "xxx"); //43 characters
define("APPSECRET", "xxxxx"); //32 characters
echo "end of define";

// https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

$crifanLib = new crifanLib();
echo "after new crifanlb";
$crifanLib->logWrite("This is crifanLib log test message not pass log file name");
$tokenUrlPattern = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";
echo $tokenUrlPattern;
$getTokenUrl = sprintf($tokenUrlPattern, APPID, APPSECRET);
print($getTokenUrl);
$crifanLib->logWrite("getTokenUrl=%s", $getTokenUrl);

?>

去运行wx_access_token.php,但是没有任何输出:

php sprintf no any ouput

【折腾过程】

1.看来只是单独添加调试代码,echo,print,则是效果不好。

2.想办法,去看服务器上面的PHP是否正常运行,web服务器是否正常,以及PHP的相关log。

root@chantyou:access_token# service httpd status
Redirecting to /bin/systemctl status  httpd.service
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
   Active: active (running) since Sat 2015-07-25 15:46:17 CST; 2 days ago
  Process: 2224 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
 Main PID: 1418 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─1418 /usr/sbin/httpd -DFOREGROUND
           ├─2232 /usr/sbin/httpd -DFOREGROUND
           ├─2233 /usr/sbin/httpd -DFOREGROUND
           ├─2234 /usr/sbin/httpd -DFOREGROUND
           ├─2235 /usr/sbin/httpd -DFOREGROUND
           ├─2236 /usr/sbin/httpd -DFOREGROUND
           ├─2587 /usr/sbin/httpd -DFOREGROUND
           ├─3749 /usr/sbin/httpd -DFOREGROUND
           └─4655 /usr/sbin/httpd -DFOREGROUND

Jul 25 15:46:17 chantyou.com httpd[1418]: AH00548: NameVirtualHost has no effect and will be removed in the next release /e...conf:1
Jul 25 15:46:17 chantyou.com httpd[1418]: AH00558: httpd: Could not reliably determine the server's fully qualified domain ...essage
Jul 25 15:46:17 chantyou.com systemd[1]: Started The Apache HTTP Server.
Jul 26 03:48:01 chantyou.com systemd[1]: Reloading The Apache HTTP Server.
Jul 26 03:48:01 chantyou.com httpd[2224]: AH00548: NameVirtualHost has no effect and will be removed in the next release /e...conf:1
Jul 26 03:48:01 chantyou.com httpd[2224]: AH00558: httpd: Could not reliably determine the server's fully qualified domain ...essage
Jul 26 03:48:01 chantyou.com systemd[1]: Reloaded The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
root@chantyou:access_token# php -m
[PHP Modules]
bz2
calendar
Core
ctype
curl
date
dom
ereg
exif
fileinfo
filter
ftp
gd
gettext
gmp
hash
iconv
json
libxml
mcrypt
mhash
mysql
mysqli
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
readline
Reflection
session
shmop
SimpleXML
sockets
SPL
sqlite3
standard
tokenizer
wddx
xml
xmlreader
xmlwriter
xsl
zip
zlib

[Zend Modules]

看起来是:

web服务器是正常的

PHP也是正常的。

3.再去看PHP的log:

【基本解决】CentOS 7中查看PHP运行时的Log文件日志信息

4.然后继续去试试运行PHP代码,看看是否log中有错误日志输出。

结果还是没有任何log输出。

5.然后直接去用:

echo "In" . __FILE__;

是可以输出结果的:

In/var/www/....../public_html/php/access_token/wx_access_token.php

6.再用:

echo "In" . __FILE__;
include_once "crifanLib.php";
echo "include OK";

结果就出错,后面的echo不显示了。

把:

function logWrite($logFormat, $logArgs = ()) {

变成:

function logWrite($logFormat) {

试试:

结果真的就

include OK

了。

7.所以,此处还是要去研究那个:

【已解决】PHP函数参数如何初始化array为空数组

然后就解决了此处的问题了。

 

【总结】

此处是由于,PHP中初始化数组为空,写成了

$logArgs = ()

导致语法出错,然后结果PHP代码运行没有任何输出。

改为

$logArgs = []

或:

$logArgs = array()

都可以。

转载请注明:在路上 » 【已解决】PHP代码尝试使用vsprintf期间出错无任何输出

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
84 queries in 0.200 seconds, using 22.12MB memory