Jump to content

Recommended Posts

Posted

I'm trying to display a random file per day. Strangely, this works on my development server but not my live server. On my live server, I get random files but it's on every page refresh. So I'm thinking something's wrong with mktime(), and maybe in combination with getRandom().

This is the code I'm using:

srand(mktime(0,0,0));
        $sectionpages = $pages->find("template=section");
        $randSection = $sectionpages->getRandom(); // get a random "section" page, each has many files
        $randFile = $randSection->files->getRandom(); // get a random file from that random "section" page.
 

Would this be a problem with my live server, like with unix/linux timestamps? Or would this be a compatibility problem with getRandom, if that makes sense? 

I also tried using some code from here: http://processwire.com/talk/topic/2081-when-random-is-too-random/
But I couldn't quite translate the code from working with Pages to files.

I'm running WAMP as my dev server, and my shared hosting uses LAMP :\ So I'm guessing there might be a problem there?

How would you guys approach this? 

As always, many many many thanks for any help!!

 

Posted

That function is now in core for use with WireArrays. This isn't only for pages.

Just as an example with a stack of images:

$fs = new WireArray();
$pa = $pages->find("template=image, image.count>0");
foreach($pa as $p){
  $fs->add($p->image);
}

$f = $fs->findRandomTimed(1);
echo $f->first
  • Like 3
Posted

Hmm, I keep getting the error: "Call to a member function findRandomTimed(1) on a non-object" ... or "Unable to complete this request due to an error. Error has been logged." 

Why would something like this or similar not work?

        $sectionpages = $pages->find("template=section"); // returns a PageArray
        $randSection = $sectionpages->findRandomTimed(1); // findRandomTimed(1) returns 1 page. PageArray is a child class of WireArray right? 
        $randFile = $randSection->files->findRandomTimed(1); // supposedly, the page of $randSection should have a field holding multiple files 
 



 

  • 1 year later...
Posted

Hmm, I have this code working (changes order or listings daily) on my dev server but it fails on live server:

$listings = wire('pages')->get('/listings/')->find('listingActive=1')->findRandomTimed(5);

I'm using PW2.5. The result on live is a different order on every call, on dev the order changes daily as it is supposed to.

I suspect the apache Suhosin extension on the live server is screwing this up as I believe it overrides PHPs rand function and changes seeding in some way. Anyone else seen this issue or have any ideas on making this work in conjunction with Suhosin.

Posted

I suspect the apache Suhosin extension on the live server is screwing this up as I believe it overrides PHPs rand function and changes seeding in some way. Anyone else seen this issue or have any ideas on making this work in conjunction with Suhosin.

[php.ini]

suhosin.srand.ignore = Off
suhosin.mt_srand.ignore = Off

OR

[.htaccess]

php_flag suhosin.mt_srand.ignore Off
php_flag suhosin.srand.ignore Off

(this might not necessarily work for you)

  • Like 1
Posted

Thx @sforsman

Yeh, shared host for this site so no php.ini access. Have tried setting this in .user.ini which also has no effect (although other settings - gd etc - can be set here successfully). Also tried in .htaccess, no luck.

I'm wondering how widespread the use of suhosin is - fairly widespread I would guess. In which case perhaps the core function findRandomTimed() should use it's own randomising logic rather than php rand()?

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...