পটভূমি প্রক্রিয়াতে সংযোগপর্বের পরিবর্তে গুজল নিক্ষেপ প্রত্যাশা


9

আমার এমন একাধিক কর্ম রয়েছে যা একাধিক কাতারে কর্মীদের উপর চলে, যার মধ্যে গুজল ব্যবহার করে কিছু এইচটিটিপি অনুরোধ রয়েছে। যাইহোক, এই কাজের অভ্যন্তরের ট্রাই-ক্যাচ ব্লকটি GuzzleHttp\Exception\RequestExceptionযখন আমি ব্যাকগ্রাউন্ড প্রক্রিয়াতে এই কাজটি চালাচ্ছি তখন আপস আপ লাগে না । চলমান প্রক্রিয়াটি হ'ল php artisan queue:workলারাভেল কিউ সিস্টেম কর্মী যা সারিবদ্ধ নজরদারি করে এবং কাজগুলি সন্ধান করে।

পরিবর্তে, ফেলে দেওয়া ব্যতিক্রম GuzzleHttp\Promise\RejectionExceptionবার্তাটির মধ্যে একটি:

প্রতিশ্রুতি যুক্তি দিয়ে প্রত্যাখ্যান করা হয়েছিল: সিআরএল ত্রুটি ২৮: 0 বাইট পেয়ে 30001 মিলি সেকেন্ডের পরে অপারেশন শেষ হয়েছে ( https://curl.haxx.se/libcurl/c/libcurl-erferences.html দেখুন )

এটি আসলে ছদ্মবেশযুক্ত GuzzleHttp\Exception\ConnectException( https://github.com/g Puzzle / promises / blob / master / src / RejectException.php#L22 দেখুন ), কারণ যদি আমি একটি নিয়মিত পিএইচপি প্রক্রিয়াতে একই রকম কাজ চালাই তবে যেটি দেখার মাধ্যমে ট্রিগার হয় is ইউআরএল, আমি ConnectExceptionবার্তাটির সাথে মতামতটি পেয়েছি :

সিআরএল ত্রুটি 28: 0 টি বাইটের মধ্যে 0 টি দিয়ে 100 মিলিসেকেন্ডের পরে অপারেশন শেষ হয়েছে ( https://curl.haxx.se/libcurl/c/libcurl-erferences.html দেখুন )

নমুনা কোড যা এই টাইমআউটটিকে ট্রিগার করবে:

try {
    $c = new \GuzzleHttp\Client([
        'timeout' => 0.1
    ]);
    $response = (string) $c->get('https://example.com')->getBody();
} catch(GuzzleHttp\Exception\RequestException $e) {
    // This occasionally gets catched when a ConnectException (child) is thrown,
    // but it doesnt happen with RejectionException because it is not a child
    // of RequestException.
}

উপরের কোডটি হয় কর্মী প্রক্রিয়ায় দৌড়ে একটি RejectionExceptionবা ConnectExceptionযখন ছুঁড়ে মারে ConnectExceptionতবে ব্রাউজারের মাধ্যমে ম্যানুয়ালি পরীক্ষা করা হয় (যা আমি বলতে পারি তা থেকে)।

সুতরাং মূলত আমি যা আহরণ করি তা RejectionExceptionহ'ল এটি বার্তাটি মোড়ানো হয় ConnectExceptionতবে আমি গুজলের অ্যাসিনক্রোনাস বৈশিষ্ট্যগুলি ব্যবহার করছি না। আমার অনুরোধগুলি কেবল সিরিজে করা হয়। কেবলমাত্র পার্থক্যটি হ'ল একাধিক পিএইচপি প্রক্রিয়াগুলি গুজল এইচটিটিপি কলগুলি করতে পারে বা নিজেই চাকরির সময়সীমা শেষ হতে পারে (যার ফলস্বরূপ লারাভেলের একটি আলাদা ব্যতিক্রম হওয়া উচিত Illuminate\Queue\MaxAttemptsExceededException) তবে আমি দেখতে পাচ্ছি না যে কীভাবে এই কোডটি আলাদাভাবে আচরণ করে causes

ব্রাউজার ট্রিগারের বিপরীতে সিএলআই থেকে চালিত হওয়ার সময় বিভিন্ন স্টাফ চালানোর জন্য গুজল প্যাকেজগুলি php_sapi_name()/ PHP_SAPIযা (যা ব্যবহৃত ইন্টারফেসটি নির্ধারণ করে) ব্যবহার করছে সেগুলির মধ্যে আমি কোনও কোড খুঁজে পাইনি ।

TL; ড

গুজল কেন RejectionExceptionআমার কর্মী প্রক্রিয়াগুলিতে আমাকে ছুঁড়ে ফেলে , তবে ConnectExceptionব্রাউজারের মাধ্যমে নিয়মিত পিএইচপি স্ক্রিপ্টগুলিতে চালিত হয়?

সম্পাদনা 1

দুঃখের বিষয় আমি ন্যূনতম প্রজননযোগ্য উদাহরণ তৈরি করতে পারি না। উপরে দেখানো সঠিক ব্যতিক্রম সহ আমি আমার সেন্ট্রি ইস্যু ট্র্যাকারে অনেক ত্রুটি বার্তা দেখতে পাচ্ছি। উত্সটি হিসাবে বর্ণিত হয়েছে Starting Artisan command: horizon:work(যা লারাভেল হরাইজন, এটি লারাভেল সারিতে তদারকি করে)। পিএইচপি সংস্করণগুলির মধ্যে কোনও তাত্পর্য আছে কিনা তা আমি আবার পরীক্ষা করে দেখেছি, তবে ওয়েবসাইট এবং কর্মী উভয়ই একই পিএইচপি চালায় 7.3.14যা সঠিক:

PHP 7.3.14-1+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Jan 23 2020 13:59:16) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.14, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.14-1+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
  • সিআরএল সংস্করণটি cURL 7.58.0
  • গুজল সংস্করণটি guzzlehttp/guzzle 6.5.2
  • লারাভেল সংস্করণটি laravel/framework 6.12.0

সম্পাদনা 2 (স্ট্যাক ট্রেস)

    GuzzleHttp\Promise\RejectionException: The promise was rejected with reason: cURL error 28: Operation timed out after 30000 milliseconds with 0 bytes received (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)
    #44 /vendor/guzzlehttp/promises/src/functions.php(112): GuzzleHttp\Promise\exception_for
    #43 /vendor/guzzlehttp/promises/src/Promise.php(75): GuzzleHttp\Promise\Promise::wait
    #42 /vendor/guzzlehttp/guzzle/src/Client.php(183): GuzzleHttp\Client::request
    #41 /app/Bumpers/Client.php(333): App\Bumpers\Client::callRequest
    #40 /app/Bumpers/Client.php(291): App\Bumpers\Client::callFunction
    #39 /app/Bumpers/Client.php(232): App\Bumpers\Client::bumpThread
    #38 /app/Models/Bumper.php(206): App\Models\Bumper::post
    #37 /app/Jobs/PostBumper.php(59): App\Jobs\PostBumper::handle
    #36 [internal](0): call_user_func_array
    #35 /vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(32): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}
    #34 /vendor/laravel/framework/src/Illuminate/Container/Util.php(36): Illuminate\Container\Util::unwrapIfClosure
    #33 /vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(90): Illuminate\Container\BoundMethod::callBoundMethod
    #32 /vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(34): Illuminate\Container\BoundMethod::call
    #31 /vendor/laravel/framework/src/Illuminate/Container/Container.php(590): Illuminate\Container\Container::call
    #30 /vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(94): Illuminate\Bus\Dispatcher::Illuminate\Bus\{closure}
    #29 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(130): Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    #28 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(105): Illuminate\Pipeline\Pipeline::then
    #27 /vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(98): Illuminate\Bus\Dispatcher::dispatchNow
    #26 /vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(83): Illuminate\Queue\CallQueuedHandler::Illuminate\Queue\{closure}
    #25 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(130): Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    #24 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(105): Illuminate\Pipeline\Pipeline::then
    #23 /vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(85): Illuminate\Queue\CallQueuedHandler::dispatchThroughMiddleware
    #22 /vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(59): Illuminate\Queue\CallQueuedHandler::call
    #21 /vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php(88): Illuminate\Queue\Jobs\Job::fire
    #20 /vendor/laravel/framework/src/Illuminate/Queue/Worker.php(354): Illuminate\Queue\Worker::process
    #19 /vendor/laravel/framework/src/Illuminate/Queue/Worker.php(300): Illuminate\Queue\Worker::runJob
    #18 /vendor/laravel/framework/src/Illuminate/Queue/Worker.php(134): Illuminate\Queue\Worker::daemon
    #17 /vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(112): Illuminate\Queue\Console\WorkCommand::runWorker
    #16 /vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(96): Illuminate\Queue\Console\WorkCommand::handle
    #15 /vendor/laravel/horizon/src/Console/WorkCommand.php(46): Laravel\Horizon\Console\WorkCommand::handle
    #14 [internal](0): call_user_func_array
    #13 /vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(32): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}
    #12 /vendor/laravel/framework/src/Illuminate/Container/Util.php(36): Illuminate\Container\Util::unwrapIfClosure
    #11 /vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(90): Illuminate\Container\BoundMethod::callBoundMethod
    #10 /vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(34): Illuminate\Container\BoundMethod::call
    #9 /vendor/laravel/framework/src/Illuminate/Container/Container.php(590): Illuminate\Container\Container::call
    #8 /vendor/laravel/framework/src/Illuminate/Console/Command.php(201): Illuminate\Console\Command::execute
    #7 /vendor/symfony/console/Command/Command.php(255): Symfony\Component\Console\Command\Command::run
    #6 /vendor/laravel/framework/src/Illuminate/Console/Command.php(188): Illuminate\Console\Command::run
    #5 /vendor/symfony/console/Application.php(1012): Symfony\Component\Console\Application::doRunCommand
    #4 /vendor/symfony/console/Application.php(272): Symfony\Component\Console\Application::doRun
    #3 /vendor/symfony/console/Application.php(148): Symfony\Component\Console\Application::run
    #2 /vendor/laravel/framework/src/Illuminate/Console/Application.php(93): Illuminate\Console\Application::run
    #1 /vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(131): Illuminate\Foundation\Console\Kernel::handle
    #0 /artisan(37): null

Client::callRequest()ফাংশন কেবল একটি মদ্যপানোত্সব ক্লায়েন্ট যার উপর আমি ফোন রয়েছে $client->request($request['method'], $request['url'], $request['options']);(তাই তোমার দর্শন লগ করা ব্যবহার করছেন না requestAsync())। আমি মনে করি সমান্তরালভাবে কাজ চালানোর সাথে এর কিছু করার আছে যা এই সমস্যার কারণ হয়ে দাঁড়ায়।

3 সম্পাদনা করুন (সমাধান পাওয়া গেছে)

নিম্নলিখিত টেস্টকেসটি বিবেচনা করুন যা HTTP অনুরোধ করে (যা নিয়মিত 200 প্রতিক্রিয়া ফিরিয়ে আনবে):

        try {
            $c = new \GuzzleHttp\Client([
                'base_uri' => 'https://example.com'
            ]);
            $handler = $c->getConfig('handler');
            $handler->push(\GuzzleHttp\Middleware::mapResponse(function(ResponseInterface $response) {
                // Create a fake connection exception:
                $e = new \GuzzleHttp\Exception\ConnectException('abc', new \GuzzleHttp\Psr7\Request('GET', 'https://example.com/2'));

                // These 2 lines both cascade as `ConnectException`:
                throw $e;
                return \GuzzleHttp\Promise\rejection_for($e);

                // This line cascades as a `RejectionException`:                
                return \GuzzleHttp\Promise\rejection_for($e->getMessage());
            }));
            $c->get('');
        } catch(\Exception $e) {
            var_dump($e);
        }

এখন আমি যা করলাম তা কল ছিল rejection_for($e->getMessage())যা RejectionExceptionবার্তাটির স্ট্রিংয়ের উপর নির্ভর করে নিজস্ব তৈরি করে। কলিং rejection_for($e)এখানে সঠিক সমাধান ছিল। উত্তর দেওয়ার জন্য কেবলমাত্র এই জিনিসটি যদি এই rejection_forফাংশনটি সাধারণ হিসাবে একই হয় throw $e


আপনি কি গুজল সংস্করণ ব্যবহার করবেন?
ভ্লাদিমির

1
লারাভেলের জন্য আপনি কোন সারি ড্রাইভার ব্যবহার করেন? উদাহরণস্বরূপ / প্রতি উদাহরণে কতজন শ্রমিক সমান্তরালভাবে চলছে? আপনার কাছে কাস্টম গুজল মিডলওয়্যার রয়েছে (ইঙ্গিত HandlerStack:)?
ক্রিস্টোফ ক্লুজে

আপনি সেন্ট্রি থেকে স্ট্যাক ট্রেস প্রদান করতে পারেন?
ভ্লাদিমির

@ ভ্লাদিমির আইভ স্ট্যাক ট্রেস যুক্ত করেছে। আমি মনে করি না এটি আপনাকে অনেক সাহায্য করবে। গুজলে (এবং সাধারণভাবে পিএইচপি) যেভাবে প্রতিশ্রুতি প্রয়োগ করা হয় তা পড়া শক্ত।
শিখা

1
@ ফ্লেম আপনি মিডলওয়্যারটি ভাগ করতে পারবেন যা উপ-গুজলের অনুরোধটি সম্পাদন করে? আমার ধারণা, সমস্যাটি সেখানেই থাকবে। এর মধ্যে আমি আমার থিসিসের সাথে একটি পুনরুত্পাদনযোগ্য উত্তর যুক্ত করব।
ক্রিস্টোফ ক্লুজ

উত্তর:


3

হ্যালো আমি জানতে চাই যে আপনার যদি ত্রুটি 4xx বা ত্রুটি 5xx রয়েছে

তবে তবুও আমি এমন সমস্যার সমাধানের জন্য কিছু বিকল্প রাখব যা আপনার সমস্যার সাথে সাদৃশ্যপূর্ণ

বিকল্প 1

আমি এটিকে ঠাপাতে চাই, আমার প্রত্যাশা অনুযায়ী কাজ করা উন্নয়ন ও পরীক্ষার পরিবেশের তুলনায় একটি নতুন প্রোডাকশন সার্ভারের অপ্রত্যাশিত 400 প্রতিক্রিয়া ফিরে আসার সাথে আমার এই সমস্যাটি ছিল; কেবল অ্যাপ্লিকেশন ইনস্টল করুন php7.0-curl এটি স্থির করে।

এটি পিপিএর মাধ্যমে পিএইচপি সহ ইনস্টল করা একটি উবুন্টু 16.04 এলটিএস ইনস্টল ছিল: অনড্রেজ / পিএইচপি, ডিবাগিংয়ের সময় আমি লক্ষ্য করেছি যে শিরোনামগুলি আলাদা ছিল were উভয়ই চুকড ডেটা সহ বহু অংশের ফর্ম পাঠাচ্ছিল, তবে php7.0-কার্ল ছাড়াই এটি সংযোগ পাঠাচ্ছিল: প্রত্যাশার চেয়ে নিকট শিরোনাম: 100-চালিয়ে যান; উভয়ের অনুরোধগুলির মধ্যে ট্রান্সফার-এনকোডিং ছিল: ছিটিয়েছে।

  বিকল্প 2

হয়তো আপনার এটি চেষ্টা করা উচিত

try {
$client = new Client();
$guzzleResult = $client->put($url, [
    'body' => $postString
]);
} catch (\GuzzleHttp\Exception\RequestException $e) {
$guzzleResult = $e->getResponse();
}

var_export($guzzleResult->getStatusCode());
var_export($guzzleResult->getBody());

প্রতিক্রিয়ার কোডটি 200 না হলে গুজলের ক্যাকচিং দরকার

বিকল্প 3

আমার ক্ষেত্রে এটি ছিল কারণ আমি অনুরোধের $ বিকল্পগুলির মধ্যে একটি ফাঁকা অ্যারে পাস করেছি [json '] আমি কন্টেন্ট-টাইপ: অ্যাপ্লিকেশন / জেসন অনুরোধ শিরোনাম পাস করার পরেও পোস্টম্যান বা সিআরএল ব্যবহার করে সার্ভারে 500 টি পুনরুত্পাদন করতে পারিনি।

যাইহোক, অনুরোধের বিকল্পগুলি অ্যারে থেকে জসন কী সরিয়ে ফেলা সমস্যার সমাধান করে।

আমি 30 মিনিটের মতো ব্যয় করেছি কী ঘটেছে তা বের করার চেষ্টা করে কারণ এই আচরণটি অত্যন্ত বেমানান। অন্যান্য সমস্ত অনুরোধের জন্য আমি করছি, $ বিকল্পগুলি ['json'] = [] পাস করার ফলে কোনও সমস্যা হয়নি। এটি সার্ভারের সমস্যা হতে পারে, আমি সার্ভারটি নিয়ন্ত্রণ করি না।

প্রাপ্ত বিশদ সম্পর্কে প্রতিক্রিয়া পাঠান


ভাল ... একটি দ্রুত এবং আরও সঠিক উত্তর পেতে। প্রশ্নটি গিটিহাবের প্রকল্প পৃষ্ঠায় পোস্ট করার উদ্যোগ নিয়েছি। আমি আশা করি আপনি গিথুব
গজল

1
ক এর ConnectExceptionকোনও সম্পর্কিত প্রতিক্রিয়া নেই, সুতরাং আমি যতটা অবগত থাকি তেমন 400 বা 500 ত্রুটি নেই। দেখে মনে হচ্ছে আপনি আসলে BadResponseException(বা ClientException(4XX) / ServerException(5XX) যা উভয় সন্তানেরই ধরা উচিত)
শিখা


2

গুজল সিঙ্ক্রোনাস এবং অ্যাসিনক্রোনাস উভয় অনুরোধের জন্য প্রতিশ্রুতি ব্যবহার করে। পার্থক্যটি হ'ল আপনি যখন সিঙ্ক্রোনাস অনুরোধটি (আপনার কেস) ব্যবহার করেন - ততক্ষণে কোনও wait() পদ্ধতিতে কল করে এটি সম্পন্ন হয় । এই অংশটি নোট করুন:

কলিং waitএকটি অঙ্গীকার করা হয়েছে যে একটি ব্যতিক্রম নিক্ষেপ করা হবে প্রত্যাখ্যাত হয়েছে। যদি প্রত্যাখ্যান কারণ হয় একটি \Exceptionকারণ নিক্ষেপ করা হয়। অন্যথায়, একটি GuzzleHttp\Promise\RejectionException নিক্ষিপ্ত হয় এবং getReason ব্যতিক্রমের পদ্ধতিতে কল করে কারণটি পাওয়া যায়।

সুতরাং, এটি ছুড়ে দেয় RequestExceptionযা একটি উদাহরণ \Exceptionএবং এটি সর্বদা 4XX এবং 5XX এইচটিটিপি ত্রুটিগুলিতে ঘটে, যদি না বিকল্পগুলি মাধ্যমে ব্যতিক্রম ছোঁড়া অক্ষম করা না হয়। আপনি দেখতে পাচ্ছেন, RejectionExceptionকারণটি \Exceptionউদাহরণস্বরূপ যদি উদাহরণস্বরূপ না হয় তবে এটি একটি ছোঁড়াও হতে পারে কারণ কারণটি যদি আপনার ক্ষেত্রে ঘটে বলে মনে হয়। অদ্ভুত বিষয়টি হ'ল গুজল সংযোগের সময়সীমা ত্রুটির উপরে ছুঁড়ে ফেলার RejectExceptionপরিবর্তে আপনি পান । যাইহোক, আপনি সেন্ট্রিতে আপনার স্ট্যাক ট্রেসের মধ্য দিয়ে গেলে এবং প্রতিশ্রুতিতে পদ্ধতিটি কোথায় ডাকা হয়েছে তা খুঁজে পেতে যদি আপনি কোনও কারণ খুঁজে পেতে পারেন ।RequestExceptionConnectExceptionRejectExceptionreject()


1

আমার উত্তরের সূচনা হিসাবে মন্তব্য বিভাগের ভিতরে লেখকের সাথে আলোচনা:

প্রশ্ন:

আপনার কাছে কাস্টম গুজল মিডলওয়্যার রয়েছে (ইঙ্গিত: হ্যান্ডলারস্ট্যাক)?

লেখকের উত্তর:

হ্যাঁ বিভিন্ন। তবে মিডলওয়্যারটি মূলত একটি অনুরোধ / প্রতিক্রিয়া সংশোধক, এমনকি আমি যে গুজল অনুরোধগুলি সেখানে করি তা সমকালীনভাবে সম্পন্ন হয়।


এটি অনুসারে এখানে আমার থিসিসটি রয়েছে:

আপনার মিডলওয়্যারের যেকোন গজলকে কল করার জন্য আপনার একটি সময়সীমা শেষ হয়েছে। সুতরাং আসুন একটি প্রজননযোগ্য কেস বাস্তবায়নের চেষ্টা করা যাক।

এখানে আমাদের একটি কাস্টম মিডলওয়্যার রয়েছে যা গুজল কল করে এবং উপ-কলটির ব্যতিক্রম বার্তা সহ একটি প্রত্যাখ্যান ব্যর্থতা দেয়। এটি বেশ জটিল, কারণ অভ্যন্তরীণ ত্রুটি-পরিচালনার কারণে এটি স্ট্যাক-ট্রেসের অভ্যন্তরে অদৃশ্য হয়ে পড়ে।

function custom_middleware(string $baseUri = 'http://127.0.0.1:8099', float $timeout = 0.2)
{
    return function (callable $handler) use ($baseUri, $timeout) {
        return function ($request, array $options) use ($handler, $baseUri, $timeout) {
            try {
                $client = new GuzzleHttp\Client(['base_uri' => $baseUri, 'timeout' => $timeout,]);
                $client->get('/a');
            } catch (Exception $exception) {
                return \GuzzleHttp\Promise\rejection_for($exception->getMessage());
            }
            return $handler($request, $options);
        };
    };
}

এটি কীভাবে আপনি এটি ব্যবহার করতে পারেন এটি একটি পরীক্ষার উদাহরণ:

$baseUri = 'http://127.0.0.1:8099'; // php -S 127.0.0.1:8099 test.php << includes a simple sleep(10); statement
$timeout = 0.2;

$handler = \GuzzleHttp\HandlerStack::create();
$handler->push(custom_middleware($baseUri, $timeout));

$client = new Client([
    'handler' => $handler,
    'base_uri' => $baseUri,
]);

try {
    $response = $client->get('/b');
} catch (Exception $exception) {
    var_dump(get_class($exception), $exception->getMessage());
}

আমি এর বিরুদ্ধে একটি পরীক্ষা করার সাথে সাথেই আমি ফিরে আসছি

$ php test2.php 
string(37) "GuzzleHttp\Promise\RejectionException"
string(174) "The promise was rejected with reason: cURL error 28: Operation timed out after 202 milliseconds with 0 bytes received (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)"

সুতরাং দেখে মনে হচ্ছে আপনার মূল গুজল কলটি ব্যর্থ হয়েছে তবে বাস্তবে এটি সাব কলটি ব্যর্থ হয়েছে।

এটি আপনাকে আপনার নির্দিষ্ট সমস্যা সনাক্ত করতে সহায়তা করে কিনা আমাকে জানান। এটিকে আরও কিছুটা ডিবাগ করার জন্য আপনি যদি মিডলওয়্যারগুলি ভাগ করতে পারেন তবে আমি অনেক প্রশংসা করব।


দেখে মনে হচ্ছে ঠিক আছে! আমি সেই মিডওয়্যারের কোথাও একটি rejection_for($e->getMessage())জায়গায় কল করছিলাম rejection_for($e)। আমি ডিফল্ট মিডলওয়্যারটির মূল উত্সটির দিকে চেয়ে ছিলাম (যেমন: github.com / গজল / গজল / ব্লোব / মাস্টার / এসআরসি / মিডলওয়্যার.এফপি #L106 ) তবে এর rejection_for($e)পরিবর্তে কেন ছিল তা বেশ কিছু বলতে পারলাম না throw $e। আমার টেস্টকেস অনুযায়ী এটি একইভাবে ক্যাসকেড বলে মনে হচ্ছে। সরলীকৃত টেস্টকেসের জন্য মূল পোস্টটি দেখুন।
শিখার

1
@ ফ্ল্যাম খুশি আমি আপনাকে সাহায্য করতে পারি :) আপনার দ্বিতীয় প্রশ্ন অনুসারে: যদি তাদের মধ্যে কোনও পার্থক্য থাকে। ওয়েল এটি সত্যিই ব্যবহারের ক্ষেত্রে আপ। আপনার নির্দিষ্ট দৃশ্যে এটি কোনও তাত্পর্যপূর্ণ করবে না (ব্যবহৃত ব্যাতিক্রম শ্রেণি বাদে) কারণ আপনার কেবলমাত্র একক কল রয়েছে। আপনি যদি একসাথে একাধিক এবং অ্যাসিঙ্ক কলগুলিতে স্যুইচ করার কথা বিবেচনা করেন তবে অন্য অনুরোধগুলি এখনও চলছে এমন সময় আপনার কোড-বাধা এড়ানোর প্রতিশ্রুতিটি ব্যবহার করা উচিত। আমার উত্তর গৃহীত হতে আপনার যদি আরও তথ্যের প্রয়োজন হয় তবে দয়া করে আমাকে জানান :)
ক্রিস্টোফ ক্লুজে

0

হ্যালো আমি বুঝতে পারিনি আপনি নিজের সমস্যার সমাধান করে শেষ করেছেন কিনা।

ভাল আমি আপনাকে পোস্ট করতে চাই ত্রুটি লগ কি। উভয় পিএইচপি এবং আপনার সার্ভারের ত্রুটি লগ মধ্যে অনুসন্ধান করুন

আমি আপনার মতামতের জন্য অপেক্ষা করছি


1
ব্যতিক্রমটি ইতিমধ্যে উপরে পোস্ট করা হয়েছে, এটি ব্যাকগ্রাউন্ড প্রক্রিয়া এবং যে রেখাটি এটি ছুড়ে ফেলেছে তা থেকে পোস্ট করার চেয়ে বেশি কিছু নেই $client->request('GET', ...)(কেবল একটি নিয়মিত গুজল ক্লায়েন্ট)।
শিখা

0

যেহেতু এটি আপনার পরিবেশে ছড়িয়ে ছিটিয়ে থাকে এবং নিক্ষেপ করা প্রতিলিপি তৈরি করা কঠিন RejectionException(কমপক্ষে আমি পারিনি), আপনি কি কেবল নিজের কোডটিতে অন্য একটি catchব্লক যুক্ত করতে পারেন, নীচে দেখুন:

try {
    $c = new \GuzzleHttp\Client([
        'timeout' => 0.1
    ]);
    $response = (string) $c->get('https://example.com')->getBody();
} catch (GuzzleHttp\Promise\RejectionException $e) {
    // Log the output of $e->getTraceAsString();
} catch(GuzzleHttp\Exception\RequestException $e) {
    // This occasionally gets catched when a ConnectException (child) is thrown,
    // but it doesnt happen with RejectionException because it is not a child
    // of RequestException.
}

এটি কখন এবং কখন ঘটে তা আপনাকে অবশ্যই আমাদের এবং আমাদের কিছু ধারণা দেবে।


দুঃখজনকভাবে এটি না। আমি সেন্ট্রিতে স্ট্যাকট্রেস পেয়েছি কারণ এটি ধরা না পড়ে, অবশেষে এটি লারাভেল এক্সেসপেশন হ্যান্ডলারের কাছে পৌঁছে যায় (এবং সেন্ট্রিতে প্রেরণ হয়ে যায়)। স্ট্যাক ট্রেসটি কেবল গুজল গ্রন্থাগারের ভিতরে আমাকে গভীরভাবে চিহ্নিত করে তবে এটি কেন প্রতিশ্রুতি গ্রহণ করছে তা আমি বুঝতে পারি না।
শিখা

এটি কেন প্রতিশ্রুতি গ্রহণ করছে তা সম্পর্কে আমার আরও উত্তর দেখুন: stackoverflow.com/a/60498078/1568963
ভ্লাদিমির
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.