在特定条件下重做最后一个foreach循环命令

时间:2015-03-31 20:52:22

标签: php web-services loops foreach error-handling

我们向网络服务提出了1000次请求。每次我们发出请求时,我们都希望得到响应,但有时Web服务会失败并且不会提供响应。当发生这种情况时,我们想要睡30秒,然后在失败的最后一点重新运行该循环。怎么办呢?

以下是基本结构:

foreach ( $objects as $object ) {
    foreach ( $otherObjects as $otherObject ) {

        //Prepare request data from $object and $otherObjects

        //Send request to webservice using cURL

        //Receive response and check to see if success
        if ( isset( $response ) ) {
            //Save response to database
        } else {
            //Not successful. Sleep for 30 seconds. Send request again up to 3 times. If ultimately successful continue, if not break and alert system admin.
        }
    }
}

2 个答案:

答案 0 :(得分:2)

foreach ( $objects as $object ) {
    foreach ( $otherObjects as $otherObject ) {

        //Prepare request data from $object and $otherObjects

        //Send request to webservice using cURL

        //Receive response and check to see if success
        if ( isset( $response ) ) {
            //Save response to database
        } else {
            $retriesLeft = 3;
            do {
                sleep(30);

                // perform the request again

                --$retriesLeft;
            }
            while (!isset($response) && $retriesLeft);
        }
    }
}

更新:简化版

foreach ( $objects as $object ) {
    foreach ( $otherObjects as $otherObject ) {
        $retriesLeft = 4;

        //Prepare request data from $object and $otherObjects

        do {
            //Send request to webservice using cURL

            //Receive response and check to see if success

            if (isset($response)) {
                break;
            }
            else {
                sleep(30);
                --$retriesLeft;
            }
        }
        while (!isset($response) && $retriesLeft);
    }
}

答案 1 :(得分:1)

您可以将请求分解为函数:

foreach ( $objects as $object ) {
    foreach ( $otherObjects as $otherObject ) {
        $tries = 0;
        //Receive response and check to see if success.
        while( ($response = doRequest($object, $otherObject)) === false && $tries < 3) {
            //Not successful. Sleep for 30 seconds. Send request again up to 3 times.
            $tries++;
            sleep(30);
        }
        if ( $response ) {
            //Successful save response to database.
        } else {
            //Not successful break and alert system admin.
    }
}

function doRequest($object, $otherObject) {
    //Prepare request data from $object and $otherObject.
    //Send request to webservice using cURL.

    return $result;
}