Re: child process

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks for your help. I updated my code to remove proc_open function. Now
its not using  child processes to generate product feeds. Its working
perfectly. But i need to know one more thing, if there would be more then
50,000 products then will it slow down the process? Will it be feasible to
create product feeds by using this direct code? Does child_process helps in
these scenarios? I will use cron to generate these feeds.

Thanks,
Nupur Walia

On Fri, Jan 16, 2015 at 5:35 PM, Stuart Dallas <stuart@xxxxxxxx> wrote:

>  On Friday, Jan 16, 2015 at 10:39 am, nupur walia <nupur.wl@xxxxxxxxx>,
> wrote:
>
>>  Hi,
>>
>> Thanks for your help, but i am not able to understand this code properly.
>> What is the use for STDIN and STDOUT? How data is coming to STDIN? Can you
>> help me understanding this?
>>
>>
> What you write to $pipes[0] will be available to the script as STDIN. What
> you read from $pipes[1] is what the script writes to STDOUT.
>
> It should be pretty simple to convert that script so you can include it
> rather than running it as a separate process. It’s beyond my ken to
> understand why it’s doing it as a separate process in the first place!
>
> -Stuart
>
> --
> Stuart Dallas
> 3ft9 Ltd
> http://3ft9.com/
>
>
>>   // Build file descriptor list for talking to child process
>>         $stdErr = Mage::getBaseDir('log') .
>> '/fontis_feedsgenerator_subprocess.txt';
>>         $descriptorSpec = array(
>>             0 => array("pipe", "r"),  // stdin is a pipe that the child
>> will read from
>>             1 => array("pipe", "w"),   // stdout is a pipe that the child
>> will write to
>>             2 => array("file", $stdErr, "a") // stderr is a file to write
>> to
>>         );
>>         $pipes = array();
>>
>>         // Build child path from current file location and Magento path
>> delimiter
>>         $execPath = escapeshellarg(dirname(__FILE__) . DS .
>> $this->CHILD_SCRIPT);
>>
>>         // Open child process with proc_open
>>         //$this->log("Opening child: ".$exec_path);
>>         $process = proc_open('php '.$execPath, $descriptorSpec, $pipes);
>>
>>         if (!is_resource($process)) {
>>             $this->log("Error opening child process.");
>>             fclose($pipes[0]);
>>         } else {
>>             // Write entity id/attribute info to pipe
>>             $data = array(
>>                 "magento_path" => $this->info("base_dir"),
>>                 "store_id" => $this->info("store_id"),
>>                 "child_class" =>
>> Mage::getConfig()->getModelClassName($this->_childClass),
>>                 "entity_ids" => $this->_accumulator,
>>                 "attributes" => $this->_attributes,
>>                 "generate_categories" => $this->generateCategories,
>>                 "config_path" => $this->_configPath,
>>             );
>>             $this->_accumulator = array();
>>
>>             fwrite($pipes[0], json_encode($data));
>>             fclose($pipes[0]);
>>
>>             // Read child's output until it finishes or child is no
>> longer running
>>             $result = '';
>>             do {
>>                 $result .= fgets($pipes[1]);
>>                 $state = proc_get_status($process);
>>             } while (!feof($pipes[1]) && $state['running']);
>>
>>             // read JSON-encoded data from child process
>>             $batchData = json_decode($result, true);
>>
>>             if (is_array($batchData)) {
>>                 $this->populateFeedWithBatchData($batchData);
>>             } else {
>>                 $this->log("Could not unserialize returned data from
>> child to array:");
>>                 $this->log($result);
>>                 $this->log($batchData);
>>             }
>>
>>            // Close child process if it's still open
>>            $status = proc_close($process);
>>         }
>>
>>         // Close remaining file handles
>>         @fclose($pipes[1]);
>>
>>
>> PHP code in file that is called using proc_open
>> $input = '';
>> do {
>>     $input .= fgets(STDIN);
>> } while (!feof(STDIN));
>>
>> $config = json_decode($input);
>>
>> // Start-up Magento stack
>> require_once $config->magento_path . '/app/Mage.php';
>>
>> $_SERVER['SCRIPT_NAME'] = $_SERVER['PHP_SELF'] = $config->magento_path .
>>         '/app/code/community/' . str_replace('_', '/',
>> $config->child_class) . '.php';
>>
>> $storeId = $config->store_id;
>> Mage::app($storeId);
>>
>> $class = $config->child_class;
>> $child = new $class($config);
>> $child->produceBatch();
>>
>> Function produceBatch :
>>
>> $products = array();
>>         foreach ($this->config->entity_ids as $entity_id) {
>>             $this->log("Processing $entity_id");
>>             $product =
>> Mage::getModel('catalog/product')->load($entity_id);
>>             $products = array_merge($products,
>> $this->processProduct($product));
>>         }
>>         fwrite(STDOUT, json_encode($products));
>>
>> Thanks,
>> Nupur Walia
>>
>> On Fri, Jan 16, 2015 at 3:23 PM, Stuart Dallas <stuart@xxxxxxxx> wrote:
>>
>>>  Please include the list when replying, or let me know where to send
>>> the invoice. And please don’t top-post; it’s against the rules not to
>>> mention incredibly annoying:
>>> http://git.php.net/?p=php-src.git;a=blob_plain;f=README.MAILINGLIST_RULES;hb=HEAD
>>>
>>> On Friday, Jan 16, 2015 at 9:43 am, nupur walia <nupur.wl@xxxxxxxxx>,
>>> wrote:
>>>
>>>>  Hi,
>>>>
>>>> I am trying to run a php process like 'php' path to php file. Its a
>>>> magento extension that used child processes to create product feeds. My
>>>> code is :
>>>> $stdErr = Mage::getBaseDir('log') .
>>>> '/fontis_feedsgenerator_subprocess.txt';
>>>>         $descriptorSpec = array(
>>>>             0 => array("pipe", "r"),  // stdin is a pipe that the child
>>>> will read from
>>>>             1 => array("pipe", "w"),   // stdout is a pipe that the
>>>> child will write to
>>>>             2 => array("file", $stdErr, "a") // stderr is a file to
>>>> write to
>>>>         );
>>>>         $pipes = array();
>>>>
>>>>         // Build child path from current file location and Magento path
>>>> delimiter
>>>>         $execPath = escapeshellarg(dirname(__FILE__) . DS .
>>>> $this->CHILD_SCRIPT);
>>>>
>>>>         // Open child process with proc_open
>>>>         //$this->log("Opening child: ".$exec_path);
>>>>         $process = proc_open('php '.$execPath, $descriptorSpec, $pipes);
>>>>
>>>>         if (!is_resource($process)) {
>>>>             $this->log("Error opening child process.");
>>>>             fclose($pipes[0]);
>>>>         } else {
>>>>             // Write entity id/attribute info to pipe
>>>>             $data = array(
>>>>                 "magento_path" => $this->info("base_dir"),
>>>>                 "store_id" => $this->info("store_id"),
>>>>                 "child_class" =>
>>>> Mage::getConfig()->getModelClassName($this->_childClass),
>>>>                 "entity_ids" => $this->_accumulator,
>>>>                 "attributes" => $this->_attributes,
>>>>                 "generate_categories" => $this->generateCategories,
>>>>                 "config_path" => $this->_configPath,
>>>>             );
>>>>             $this->_accumulator = array();
>>>>
>>>>             fwrite($pipes[0], json_encode($data));
>>>>             fclose($pipes[0]);
>>>>
>>>>             // Read child's output until it finishes or child is no
>>>> longer running
>>>>             $result = '';
>>>>             do {
>>>>                 $result .= fgets($pipes[1]);
>>>>                 $state = proc_get_status($process);
>>>>             } while (!feof($pipes[1]) && $state['running']);
>>>>
>>>>             // read JSON-encoded data from child process
>>>>             $batchData = json_decode($result, true);
>>>>
>>>>             if (is_array($batchData)) {
>>>>                 $this->populateFeedWithBatchData($batchData);
>>>>             } else {
>>>>                 $this->log("Could not unserialize returned data from
>>>> child to array:");
>>>>                 $this->log($result);
>>>>                 $this->log($batchData);
>>>>             }
>>>>
>>>>            // Close child process if it's still open
>>>>            $status = proc_close($process);
>>>>         }
>>>>
>>>>         // Close remaining file handles
>>>>         @fclose($pipes[1]);
>>>>
>>>>
>>>> It read data and write to it some file. Using proc_open pipes. I dont
>>>> know how to use curl for this code?
>>>>
>>>
>>>  Curl is not really applicable to what you’re doing.
>>>
>>> You’re wanting to run PHP code from PHP code? There’s no need to run a
>>> new process for this, simply include the code you want to run. How easy
>>> that will be depends on what the PHP script you’re including is trying to
>>> do, but there is rarely a reason to run a new instance of PHP from a PHP
>>> script.
>>>
>>> -Stuart
>>>
>>> --
>>> Stuart Dallas
>>> 3ft9 Ltd
>>> http://3ft9.com/
>>>
>>>   On Fri, Jan 16, 2015 at 3:07 PM, Stuart Dallas <stuart@xxxxxxxx>
>>>> wrote:
>>>>
>>>>>   On Friday, Jan 16, 2015 at 9:15 am, nupur walia <nupur.wl@xxxxxxxxx>,
>>>>> wrote:
>>>>>
>>>>>> I am using proc_open in my code but this function is disabled on my
>>>>>> server.
>>>>>> Can you please tell me if there is any other function that i can use
>>>>>> in
>>>>>> place of proc_open?
>>>>>>
>>>>>> Can i use curl in place of proc_open? If yes then please let me know
>>>>>> how
>>>>>> can i use curl to replace proc_open?
>>>>>
>>>>>
>>>>>  What are you actually trying to do?
>>>>>
>>>>> If you’re trying to make an HTTP request (as implied by your question)
>>>>> you can use the curl extension if it’s installed: http://php.net/curl.
>>>>> If not there are probably other way to accomplish what you’re trying to do,
>>>>> but we’ll need details to be able to help any further.
>>>>>
>>>>> -Stuart
>>>>>
>>>>> --
>>>>> Stuart Dallas
>>>>> 3ft9 Ltd
>>>>> http://3ft9.com/
>>>>>
>>>>
>>>>
>>

[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux