I am using CakePHP to develop a bidding site. I have created a controller called 'daemons' and it performs 4 different tasks which I need to run continuously on the server every minute. I have set this up as 4 cron jobs but something is not working right and my crons just fail to work!
Could be a problem with the controller, just not able to place it. My controller code is pasted below:
Expand|Select|Wrap|Line Numbers
- <?php
- class DaemonsController extends AppController {
- var $name = 'Daemons';
- var $uses = array('Auction', 'Setting');
- function beforeFilter(){
- $email='abc@gmail.com';
- $secondemail='no-reply@xyz.com';
- $mess='It works';
- //@mail($email, 'Test', $mess, "From: ".$secondemail);
- parent::beforeFilter();
- if(!empty($this->Auth)) {
- $this->Auth->allow('bidbutler', 'extend', 'autobid', 'close');
- }
- ini_set('max_execution_time', ($this->appConfigurations['cronTime'] * 60) + 1);
- }
- /**
- * The function makes the bid butler magic happen
- *
- * @return array Affected Auction
- */
- function bidbutler() {
- $this->layout = 'js/ajax';
- $data = array();
- $setting = array();
- $auctions = array();
- // Get the bid butler time
- $bidButlerTime = $this->Setting->get('bid_butler_time');
- // Get various settings needed
- $data['bid_debit'] = $this->Setting->get('bid_debit');
- $data['auction_price_increment'] = $this->Setting->get('auction_price_increment');
- $data['auction_time_increment'] = $this->Setting->get('auction_time_increment');
- $data['auction_peak_start'] = $this->Setting->get('auction_peak_start');
- $data['auction_peak_end'] = $this->Setting->get('auction_peak_end');
- $expireTime = time() + ($this->appConfigurations['cronTime'] * 60);
- while (time() < $expireTime) {
- // Formating the conditions
- $conditions = array(
- 'Auction.end_time < \''. date('Y-m-d H:i:s', time() + $bidButlerTime). '\'',
- 'Auction.closed' => 0,
- 'Bidbutler.bids >' => 0
- );
- // Find the bidbutler entry - we get them from the lowest price to the maximum price so that they all run!
- $this->Auction->Bidbutler->contain('Auction');
- $bidbutlers = $this->Auction->Bidbutler->find('all', array('conditions' => $conditions, 'order' => 'rand()', 'fields' => array('Auction.id', 'Auction.start_price', 'Bidbutler.id', 'Bidbutler.minimum_price', 'Bidbutler.maximum_price', 'Bidbutler.user_id'), 'contain' => 'Auction'));
- if(!empty($bidbutlers)) {
- // Walk through bidbutler entries
- foreach($bidbutlers as $bidbutler) {
- if($bidbutler['Bidbutler']['minimum_price'] >= $bidbutler['Auction']['start_price'] &&
- $bidbutler['Bidbutler']['maximum_price'] < $bidbutler['Auction']['start_price']) {
- // Add more information
- $data['auction_id'] = $bidbutler['Auction']['id'];
- $data['user_id'] = $bidbutler['Bidbutler']['user_id'];
- $data['bid_butler'] = $bidbutler['Bidbutler']['id'];
- // Bid the auction
- $result = $this->Auction->bid($data);
- }
- }
- }
- usleep(900000);
- }
- }
- /**
- * The function auto extends auctions and bids for an auto bid if neccessary
- *
- * @return array Affected Auction
- */
- function extend() {
- $this->layout = 'js/ajax';
- $data = array();
- $setting = array();
- $auctions = array();
- $data['bid_debit'] = $this->Setting->get('bid_debit');
- $data['auction_price_increment'] = $this->Setting->get('auction_price_increment');
- $data['auction_time_increment'] = $this->Setting->get('auction_time_increment');
- $data['auction_peak_start'] = $this->Setting->get('auction_peak_start');
- $data['auction_peak_end'] = $this->Setting->get('auction_peak_end');
- $data['isPeakNow'] = $this->isPeakNow();
- $expireTime = time() + ($this->appConfigurations['cronTime'] * 60);
- while (time() < $expireTime) {
- // now check for auto extends
- $auctions = Cache::read('daemons_extend_auctions');
- if(empty($auctions)) {
- $auctions = $this->Auction->find('all', array('contain' => '', 'conditions' => "(Auction.extend_enabled = 1 OR Auction.autobid = 1) AND (Auction.start_price < Auction.minimum_price) AND Auction.winner_id = 0 AND Auction.closed = 0"));
- Cache::write('daemons_extend_auctions', $auctions, '+1 day');
- }
- if(!empty($auctions)) {
- foreach($auctions as $auction) {
- // lets see if we need to extend the auction
- $endTime = strtotime($auction['Auction']['end_time']);
- $extendTime = time() + ($auction['Auction']['time_before_extend']);
- if($extendTime > $endTime) {
- // lets see if autobid is enabled
- // autobid will place a bid by a robot if another user is the highest bidder but hasn't meet the minimum price
- if($auction['Auction']['autobid'] == 1) {
- if($auction['Auction']['extend_enabled'] == 1) {
- // lets only bid if the limit is less than te autobid limit when the autobid limit is set
- if($auction['Auction']['autobid_limit'] > 0) {
- if($auction['Auction']['current_limit'] <= $auction['Auction']['autobid_limit']) {
- $this->Auction->Autobid->check($auction['Auction']['id'], $auction['Auction']['end_time'], $data);
- }
- } else {
- $this->Auction->Autobid->check($auction['Auction']['id'], $auction['Auction']['end_time'], $data);
- }
- } else {
- $bid = $this->Auction->Bid->lastBid($auction['Auction']['id']);
- // lets set the autobid
- if(!empty($bid) && ($bid['autobidder'] == 0)) {
- $this->Auction->Autobid->check($auction['Auction']['id'], $auction['Auction']['end_time'], $data);
- }
- }
- } elseif($auction['Auction']['extend_enabled'] == 1) {
- unset($auction['Auction']['modified']);
- $auction['Auction']['end_time'] = date('Y-m-d H:i:s', $endTime + ($auction['Auction']['time_extended']));
- // lets do a quick check to make sure the new end time isn't less than the current time
- $newEndTime = strtotime($auction['Auction']['end_time']);
- if($newEndTime < time()) {
- $auction['Auction']['end_time'] = date('Y-m-d H:i:s', time() + ($auction['Auction']['time_extended']));
- }
- $this->Auction->save($auction);
- }
- }
- }
- }
- usleep(800000);
- }
- }
- /**
- * The function auto extends auctions in the last IF the extend function fails
- *
- * @return array Affected Auction
- */
- function autobid() {
- $data['bid_debit'] = $this->Setting->get('bid_debit');
- $data['auction_time_increment'] = $this->Setting->get('auction_time_increment');
- $data['auction_price_increment'] = $this->Setting->get('auction_price_increment');
- $data['auction_peak_start'] = $this->Setting->get('auction_peak_start');
- $data['auction_peak_end'] = $this->Setting->get('auction_peak_end');
- $data['isPeakNow'] = $this->isPeakNow();
- $isPeakNow = $this->isPeakNow();
- $expireTime = time() + ($this->appConfigurations['cronTime'] * 60);
- while (time() < $expireTime) {
- // lets start by getting all the auctions that have closed
- $auctions = $this->Auction->find('all', array('fields' => array('Auction.id', 'Auction.peak_only'), 'contain' => '', 'conditions' => "Auction.winner_id = 0 AND Auction.end_time <= '" . date('Y-m-d H:i:s', time() + 4) . "' AND Auction.closed = 0"));
- if(!empty($auctions)) {
- foreach($auctions as $auction) {
- // before we declare this user the winner, lets run some test to make sure the auction can definitely close
- if($this->Auction->checkCanClose($auction['Auction']['id'], $isPeakNow, false) == false) {
- // lets check to see if the reason we can't close it, is because its now offpeak and this is a peak auction
- if($auction['Auction']['peak_only'] == 1 && !$isPeakNow) {
- continue;
- } else {
- $this->Auction->Autobid->placeAutobid($auction['Auction']['id'], $data);
- }
- }
- }
- }
- usleep(900000);
- }
- }
- /**
- * The function closes the auctions
- *
- * @return array Affected Auction
- */
- function close() {
- $expireTime = time() + ($this->appConfigurations['cronTime'] * 60);
- while (time() < $expireTime) {
- // lets start by getting all the auctions that have closed
- $auctions = $this->Auction->find('all', array('contain' => '', 'conditions' => "Auction.winner_id = 0 AND Auction.end_time <= '" . date('Y-m-d H:i:s') . "' AND Auction.closed = 0"));
- if(!empty($auctions)) {
- foreach($auctions as $auction) {
- $isPeakNow = $this->isPeakNow();
- // before we declare this user the winner, lets run some test to make sure the auction can definitely close
- if($this->Auction->checkCanClose($auction['Auction']['id'], $isPeakNow) == false) {
- // lets check to see if the reason we can't close it, is because its now offpeak and this is a peak auction
- if($auction['Auction']['peak_only'] == 1 && !$isPeakNow) {
- $peak = $this->nonPeakDates();
- //Calculate how many seconds auction will end after peak end
- $seconds_after_peak = strtotime($auction['Auction']['end_time']) - strtotime($peak['peak_end']);
- $end_time = strtotime($peak['peak_start']) + $seconds_after_peak;
- $auction['Auction']['end_time'] = date('Y-m-d H:i:s', $end_time);
- $this->Auction->save($auction);
- } else {
- // lets check just how far ago this auction closed, and either place an autobid or extend the time
- $data['auction_time_increment'] = $this->Setting->get('auction_time_increment');
- $newEndTime = strtotime($auction['Auction']['end_time']);
- if($newEndTime < time() - $data['auction_time_increment']) {
- $auction['Auction']['end_time'] = date('Y-m-d H:i:s', time() + ($auction['Auction']['time_extended']));
- $this->Auction->save($auction);
- } else {
- //lets extend it by placing an autobid
- $data['bid_debit'] = $this->Setting->get('bid_debit');
- $data['auction_price_increment'] = $this->Setting->get('auction_price_increment');
- $data['auction_peak_start'] = $this->Setting->get('auction_peak_start');
- $data['auction_peak_end'] = $this->Setting->get('auction_peak_end');
- $data['isPeakNow'] = $this->isPeakNow();
- $this->Auction->Autobid->placeAutobid($auction['Auction']['id'], $data);
- }
- }
- continue;
- }
- $bid = $this->Auction->Bid->find('first', array('conditions' => array('Bid.auction_id' => $auction['Auction']['id']), 'order' => array('Bid.id' => 'desc')));
- if(!empty($bid)) {
- if($bid['User']['autobidder'] == 0) {
- // send the email to the winner
- $data['Auction'] = $auction['Auction'];
- $data['Bid'] = $bid['Bid'];
- $data['User'] = $bid['User'];
- $data['to'] = $data['User']['email'];
- $data['subject'] = sprintf(__('%s - You have won an auction', true), $this->appConfigurations['name']);
- $data['template'] = 'auctions/won_auction';
- $this->_sendEmail($data);
- $auction['Auction']['status_id'] = 1;
- }
- $auction['Auction']['winner_id'] = $bid['Bid']['user_id'];
- }
- unset($auction['Auction']['modified']);
- $auction['Auction']['closed'] = 1;
- $this->Auction->save($auction);
- }
- }
- usleep(900000);
- }
- }
- }
- ?>
Thanks!