【问题标题】:getting empty output when run the php script in terminal在终端中运行 php 脚本时得到空输出
【发布时间】:2015-08-07 04:43:32
【问题描述】:

以下代码在 netbeans 中运行良好,但在使用 shell 脚本的终端中运行良好。如果有人有任何想法,请分享。

test3cron.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

@ob_start();
session_start();
$callbackUrl = "http://mgstore/test3cron.php";
$temporaryCredentialsRequestUrl = "http://mgstore/oauth/initiate?oauth_callback=" . urlencode($callbackUrl);
$adminAuthorizationUrl = 'http://mgstore/admin/oauth_authorize';
$accessTokenRequestUrl = 'http://mgstore/oauth/token';
$apiUrl = 'http://mgstore/api/rest';
$consumerKey = 'd9a371ca7661bee18de8d75f50b7e386';
$consumerSecret = '51486d1b2bd688a927a3eced64ed803e';
error_reporting(E_ALL ^ E_NOTICE);

if (!isset($_GET['oauth_token']) && isset($_SESSION['state']) && $_SESSION['state'] == 1) {
    $_SESSION['state'] = 0;
}
try {
    $authType = ($_SESSION['state'] == 2) ? OAUTH_AUTH_TYPE_AUTHORIZATION : OAUTH_AUTH_TYPE_URI;
    $oauthClient = new OAuth($consumerKey, $consumerSecret, OAUTH_SIG_METHOD_HMACSHA1, $authType);
    $oauthClient->enableDebug();
    $oauthClient->disableSSLChecks();


    if (!isset($_GET['oauth_token']) && !$_SESSION['state']) {
        $requestToken = $oauthClient->getRequestToken($temporaryCredentialsRequestUrl);
        $_SESSION['secret'] = $requestToken['oauth_token_secret'];
        $_SESSION['state'] = 1;
        header('Location: ' . $adminAuthorizationUrl . '?oauth_token=' . $requestToken['oauth_token']);

        exit;
    } else if ($_SESSION['state'] == 1) {

        $oauthClient->setToken($_GET['oauth_token'], $_SESSION['secret']);
        $accessToken = $oauthClient->getAccessToken($accessTokenRequestUrl);
        $_SESSION['state'] = 2;
        $_SESSION['token'] = $accessToken['oauth_token'];
        $_SESSION['secret'] = $accessToken['oauth_token_secret'];
        header('Location: ' . $callbackUrl);

        exit;

    } else {

        $oauthClient->setToken($_SESSION['token'], $_SESSION['secret']);
        $resourceUrl = $apiUrl . "/customers?page=400&limit=1";
        $oauthClient->fetch($resourceUrl, array(), 'GET', array("Content-Type" => "application/json", "Accept" => "*/*"));
        $customerList = json_decode($oauthClient->getLastResponse());

    }
    if (is_array($customerList) || is_object($customerList)) {
        foreach ($customerList as $object) {
            $entityid = $object->entity_id;
            echo "ENTITY ID:" . "$entityid" . "<br>";

            $name1 = $object->firstname;
            $name2 = $object->lastname;
            $customersince = $object->created_at;
            echo "Created at:$customersince<br>";
            $name = $name1 . " " . $name2;
            echo "NAME:" . "$name" . "<br>";
            $email = $object->email;
            echo "EMAIL:" . "$email" . "<br>";
        }
    }
} catch (OAuthException $e) {
    print_r($e);
}

当我在 netbeans(shift+f6) 中运行上述脚本时,我得到以下输出:

ENTITY ID:167
Created at:2015-07-31 12:37:04
NAME:shahid md
EMAIL:shahid@gmail.com

相同的脚本,我尝试在终端中运行如下,但它显示空输出。

cron.sh

#!/bin/bash

SCRIPTPATH=$( cd $(dirname $0) ; pwd -P )
PHP='/usr/bin/php'
# tailf /var/log/cron

cd $SCRIPTPATH
# TO RUN ALL CORN JOBS

$PHP -q test3cron.php

以下命令用于运行脚本文件: 但是这里什么都没有。

rizwan@rizwan-Inspiron-3520:~/PHP-workspace/mgstore$ ./cron.sh

rizwan@rizwan-Inspiron-3520:~/PHP-workspace/mgstore$

我也尝试了以下链接:

https://magento.stackexchange.com/questions/75414/running-the-magento-rest-api-php-example

  rizwan@rizwan-Inspiron-3520:~/PHP-workspace/mgstore$ php -S
 localhost:8088 test3cron.php

**Response as follows:**

 PHP 5.5.9-1ubuntu4.11 Development Server started at Tue Aug 11
 10:32:54 2015 Listening on http://localhost:8088 Document root is
 /home/rizwan/PHP-workspace/mgstore Press Ctrl-C to quit.

【问题讨论】:

    标签: php shell rest cron sh


    【解决方案1】:

    您已通过 @ob_start(); 启用输出缓冲,但您从未结束输出缓冲 (ob_end_flush();)。此外,设置error_reporting(E_ALL ^ E_NOTICE); 将禁用报告NOTICE 错误(只需将其设置为-1)。

    您还可以通过 CLI 脚本访问 $_SESSION。这可以正常工作,但可能无法达到您的预期。

    但是,在我看来,这里实际发生的事情是,您只是进入了一个不会产生任何输出的执行路径。见这里:

    if (!isset($_GET['oauth_token']) && !$_SESSION['state']) {
            $requestToken = $oauthClient->getRequestToken($temporaryCredentialsRequestUrl);
            $_SESSION['secret'] = $requestToken['oauth_token_secret'];
            $_SESSION['state'] = 1;
            header('Location: ' . $adminAuthorizationUrl . '?oauth_token=' . $requestToken['oauth_token']);
    
            exit;
    

    由于这不是 HTTP 请求,$_GET['oauth_token'] 不会被设置,$_SESSION['state'] 将是0,因此是错误的。它所做的只是获取一个令牌,输出一个标题,然后退出脚本。我敢打赌,如果您在代码的那个分支中添加echo,您会看到它打印出来。我推荐的调试方法是在整个过程中添加echo 语句并跟踪代码的执行路径。

    【讨论】:

    • 非常感谢您的回复,我是 php 新手,您能解释清楚吗,代码只有在阻塞时才执行,如果我在 if 阻塞后给出任何回显,它将不起作用。
    • 拜托,任何人都可以为此提供任何想法吗?
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 2013-04-05
    • 2018-11-17
    • 2010-11-24
    • 2019-04-01
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多