I have been googling for this but no one appears to have the answer.
This post describes the problem well:
http://www.mail-archive.com/php-general@lists.php.net/
microsoft released a fix for this: http://www.microsoft.com/downloads/en/results.aspx?freetext=980363&displaylang=en&stype=s_basic
I don't have PHP here to test this, but wouldn't this produce a 301?
header('Location: http://www.example.com/', true, 301);
It appears that the only answer to this one at the moment is to not use FastCGI on IIS7 when using PHP (because of a bug in FastCGI) - which is rubbish because it's very quick. Using isapi allows the 301 redirects to work as they should, but it's not as fast.
It should be as given by R. Bemrose; that's the usual example code. I guess there is something not-quite-right about your PHP execution environment.
Another method you can try is the CGI standard way of passing back a status line:
header('Status: 301 Moved permanently');
header('Location: http://www.example.com/');